我有一个用于配置一些规则的XML,它没有复杂的结构,但是这个配置在我的系统中的任何地方使用,所以我想将这个XML解析为java对象并设计为单例模式,是任何好的方法我可以用它来直接解析XML到Java对象,而无需编写太多的代码?
我做了一些关于谷歌的研究,知道JAXB是一个选择,我的应用程序只是一些工具程序,它读取规则,然后按照做的东西,JAXB可以更广泛地用于Web服务,它适合我的项目?
如果是,最重要的问题是,我使用xjc根据xsd文件生成java对象的源类,在unmarshal之后我将直接获取这些configurationType对象,是否有必要再次转换,(从JaxB类到我自己的java pojo对象配置),我看到大多数编码器都这样做了,但为什么呢?因为它们是一些数据,只是从生成到JAXB的对象并复制到自己创建的POJO对象
答案 0 :(得分:57)
JAXB是一种理想的解决方案。但是你不一定需要xsd和xjc。通常你没有xsd,但你知道你的xml是什么。只需分析您的xml,例如,
<customer id="100">
<age>29</age>
<name>mkyong</name>
</customer>
创建必要的模型类:
@XmlRootElement
public class Customer {
String name;
int age;
int id;
public String getName() {
return name;
}
@XmlElement
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
@XmlElement
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
@XmlAttribute
public void setId(int id) {
this.id = id;
}
}
尝试解组:
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Customer customer = (Customer) jaxbUnmarshaller.unmarshal(new File("C:\\file.xml"));
检查结果,修复错误!
答案 1 :(得分:6)
考虑到你有一个XML文件,有一件事非常重要:
<customer id="100">
<Age>29</Age>
<NAME>mkyong</NAME>
</customer>
我很遗憾地通知你,但是:
@XmlElement
public void setAge(int age) {
this.age = age;
}
无法帮助您,因为它会尝试从XML中查找“age”而不是“Age”元素名称。
我建议您手动指定与XML文件中的元素名称匹配的元素名称:
@XmlElement(name="Age")
public void setAge(int age) {
this.age = age;
}
如果你有例如:
@XmlRootElement
@XmlAccessorType (XmlAccessType.FIELD)
public class Customer {
...
这意味着它默认使用java bean,此时如果你指定你不能设置另一个
对于元素@XmlElement(name="NAME")
<NAME>..</NAME>
的setter方法之上的注释,它将失败,表示单个变量上不能有两个元素。
我希望它有所帮助。
答案 2 :(得分:5)
使用JAXB执行Unmarshall:
1)将给定的XML转换为XSD(由您自己或在线转换器),
2)在eclipse中创建一个JAXB项目,
3)创建XSD文件并将转换后的XSD内容粘贴到其中,
4)右键单击** XSD文件 - &gt;产生 - &GT; JAXB类 - &gt;按照说明操作(这将在src中创建所有nessasary .java文件,即一个package-info,object factory和pojo类),
5)在src中创建另一个.java文件来操作unmarshall操作,并运行它。
快乐编码 !!
答案 3 :(得分:3)
JAXB是一个可靠的选择,因为它可以顺利地映射xml到java类。但是还有其他框架可供选择,其中就有一个:
答案 4 :(得分:1)
我发现jackson fasterxml
是使用XML的serializing/deserializing
bean的一个不错的选择。