如何解析xml到java对象?

C.c*_*C.c 28 java xml

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

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

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

Evg*_*eev 59

JAXB是一种理想的解决方案.但是你不一定需要xsd和xjc.通常你没有xsd,但你知道你的xml是什么.只需分析您的xml,例如,

<customer id="100">
    <age>29</age>
    <name>mkyong</name>
</customer>
Run Code Online (Sandbox Code Playgroud)

创建必要的模型类:

@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;
    }

}
Run Code Online (Sandbox Code Playgroud)

尝试解组:

JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Customer customer = (Customer) jaxbUnmarshaller.unmarshal(new File("C:\\file.xml"));
Run Code Online (Sandbox Code Playgroud)

检查结果,修复错误!


aks*_*aks 6

考虑到您有一个XML文件,有一点非常重要:

<customer id="100">
    <Age>29</Age>
    <NAME>mkyong</NAME>
</customer>
Run Code Online (Sandbox Code Playgroud)

很抱歉通知您,但是:

@XmlElement
public void setAge(int age) {
    this.age = age;
}
Run Code Online (Sandbox Code Playgroud)

不会帮助你,因为它试图从XML中寻找"age"而不是"Age"元素名称.

我建议您手动指定与XML文件中的元素名称匹配的元素名称:

@XmlElement(name="Age")
public void setAge(int age) {
    this.age = age;
}
Run Code Online (Sandbox Code Playgroud)

如果你有例如:

@XmlRootElement
@XmlAccessorType (XmlAccessType.FIELD)
public class Customer {
...
Run Code Online (Sandbox Code Playgroud)

这意味着默认情况下它将使用java bean,此时如果指定您不能设置另一个

@XmlElement(name="NAME")
Run Code Online (Sandbox Code Playgroud)

对于元素的setter方法上面的注释,<NAME>..</NAME>它将失败,表示在一个单独的变量上不能有两个元素.

我希望它有所帮助.


Sou*_*kar 5

使用JAXB执行Unmarshall:

1)将给定的XML转换为XSD(由您自己或在线转换器),

2)在eclipse中创建一个JAXB项目,

3)创建XSD文件并将转换后的XSD内容粘贴到其中,

4)右键单击**XSD文件 - >生成 - > JAXB类 - >按照说明操作(这将在src中创建所有nessasary .java文件,即一个package-info,object factory和pojo类),

5)在src中创建另一个.java文件来操作unmarshall操作,然后运行它.

快乐编码 !!