如何解析xml到java对象?

时间:2013-05-03 17:28:06

标签: java xml

我有一个用于配置一些规则的XML,它没有复杂的结构,但是这个配置在我的系统中的任何地方使用,所以我想将这个XML解析为java对象并设计为单例模式,是任何好的方法我可以用它来直接解析XML到Java对象,而无需编写太多的代码?

我做了一些关于谷歌的研究,知道JAXB是一个选择,我的应用程序只是一些工具程序,它读取规则,然后按照做的东西,JAXB可以更广泛地用于Web服务,它适合我的项目?

如果是,最重要的问题是,我使用xjc根据xsd文件生成java对象的源类,在unmarshal之后我将直接获取这些configurationType对象,是否有必要再次转换,(从JaxB类到我自己的java pojo对象配置),我看到大多数编码器都这样做了,但为什么呢?因为它们是一些数据,只是从生成到JAXB的对象并复制到自己创建的POJO对象

5 个答案:

答案 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类。但是还有其他框架可供选择,其中就有一个:

https://code.google.com/p/xmappr/

答案 4 :(得分:1)

我发现jackson fasterxml是使用XML的serializing/deserializing bean的一个不错的选择。

参考:How to use spring to marshal and unmarshal xml?