我有一个XML文件。它可能是这样的:
<person>
<name>
<firstname>Joni</firstname>
<lastname>Smith</lastname>
</name>
<born year="1983" day="31" month="01">Finland</born>
... lots of elements ...
</person>
我的目标是创建类Person。我怎么能“自动”做到?我想我已经使用了一些maven castor插件从XML文件中创建了一个非常复杂的对象图而没有花费太多精力。但是,我不记得那个插件是什么,实在不记得我是如何使用它的。我也很高兴了解您可能知道的其他(可能更好)的工具。
答案 0 :(得分:3)
我同意使用JAXB。
从XML Schema开始(从XML Schema生成类)
您可以使用JAXB从XML Schema生成Java源代码。以下是使用EclipseLink JAXB(MOXy)执行此操作的说明:
Java SE 6附带Metro JAXB XJC编译器,它可以在JDK安装的bin目录中找到:
C:\Program Files\Java\jdk1.6.0_20\bin>xjc -d outputDir mySchema.xsd
Eclipse中的Dali插件也有这种支持,请参阅有关JAXB类生成的部分:
从对象开始
使用对象模型,您可以在MOXy JAXB中找到基于XPath的映射扩展:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
@XmlPath("name/firstname/text()")
private String firstName;
@XmlPath("name/lastname/text()")
private String lastName;
// ...
}
可以与以下演示代码一起使用来处理XML:
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Person person = (Person) unmarshaller.unmarshal(new File("input.xml"));
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(person, System.out);
}
}
有关基于XPath的映射的详细信息,请参阅:
对于“born”元素,您可能会发现JAXB的XmlAdapter很有用:
答案 1 :(得分:1)
有几种工具。来自Apache Commons的Digester就是其中之一。使用起来非常简单。
更新:这是一个comparison,其他答案中提到了其他工具(xmlbeans,jaxb)。总之,Digester是最薄的,只适合将xml加载到对象中(例如,特别适用于“内部”配置文件)。其他工具更倾向于完整的xml-object映射(两个方向),并且在涉及xml模式时特别有用。
答案 2 :(得分:1)
查看JAXB。有很多工具,选择最适合您需求的工具。
答案 3 :(得分:0)
Apache XMLBeans是一种从XML生成类的非常好的方法,并且支持许多其他工具不能很好地支持的高级XML特性(例如类型继承)。 XMLBeans有一个命令行工具,用于生成一个jar,然后包含在项目中,该jar包含所有bean类以及用于创建和使用XML文档的工厂。