给出一个场景: 我有自己的系统的对象结构。现在我必须将多个XML源映射到我的java类。而且无需将Java对象转换回XML。
您对我使用Digester或JAXB的建议是什么?目前我倾向于使用Digester,因为我可以为每个XML源指定XML路径到同一个对象方法调用,而Digester似乎更容易维护。虽然JAXB有很好的设计来编组/解组java和XML,但我认为它太复杂了,每个xml-java映射都需要xml架构,对吧?
我认为Digester或JAXB都有自己的使命来适应不同的使用场景,所以需要你的建议来帮我决定其中一个。非常感谢。
答案 0 :(得分:4)
我认为您可能对JAXB有不正确的看法。它可能很复杂,如果您选择这样做,但它也可以非常简单。例如,您可以将整个XML文档绑定到只有一个注释的对象图上。
此外,架构的东西是红鲱鱼。 JAXB 可以从XML Schema生成java代码,但这对于拥有模式的情况来说非常方便。如果不这样做,则忽略该部分。您可以手动注释您的班级模型,这很容易。
另一方面,Digester更难以维护(在我看来),因为你必须在你的班级模型中添加路径表达式。答案 1 :(得分:3)
JAXB的一个优点是它是一个具有多个实现的规范(JSR-222):Metro,EclipseLink MOXy,JaxMe。这可以避免供应商锁定的问题。
基于XPath的映射
EclipseLink JAXB (MOXy)有一个扩展来支持基于XPath的映射(我是技术主管)。
package blog.geocode;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlRootElement(name="kml")
@XmlType(propOrder={"country", "state", "city", "street", "postalCode"})
public class Address {
@XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:Thoroughfare/ns:ThoroughfareName/text()")
private String street;
@XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:LocalityName/text()")
private String city;
@XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:AdministrativeAreaName/text()")
private String state;
@XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:CountryNameCode/text()")
private String country;
@XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:PostalCode/ns:PostalCodeNumber/text()")
private String postalCode;
}
多个XML来源
要将多个XML表示应用于对象模型,您可以利用MOXy的XML元数据。这是JAXB标准的另一个扩展。示例文件如下所示:
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="blog.bindingfile">
<xml-schema
namespace="http://www.example.com/customer"
element-form-default="QUALIFIED"/>
<java-types>
<java-type name="Customer">
<xml-root-element/>
<xml-type prop-order="firstName lastName address phoneNumbers"/>
<java-attributes>
<xml-element java-attribute="firstName" name="first-name"/>
<xml-element java-attribute="lastName" name="last-name"/>
<xml-element java-attribute="phoneNumbers" name="phone-number"/>
</java-attributes>
</java-type>
<java-type name="PhoneNumber">
<java-attributes>
<xml-attribute java-attribute="type"/>
<xml-value java-attribute="number"/>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
有关详情:
答案 2 :(得分:1)
也许偏离主题:我放弃了消化器,转而支持xstream。也许看看