33

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

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

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

4

5 回答 5

66

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"));

检查结果,修复错误!

于 2013-05-03T17:35:53.717 回答
8

考虑到您有一个 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 beans,此时如果你指定你不能设置另一个

@XmlElement(name="NAME")

在一个元素的 setter 方法上方注释<NAME>..</NAME>它会失败,说一个变量上不能有两个元素。

我希望它有所帮助。

于 2016-10-25T18:11:53.880 回答
7

使用 JAXB 执行 Unmarshall:

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

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

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

4) 右键单击​​*XSD 文件--> 生成--> JAXB 类--> 按照说明操作(这将在 src 中创建所有必需的 .java 文件,即一个包信息、对象工厂和 pojo 类),

5)在src中再创建一个.java文件进行unmarshall操作,运行。

快乐编码

于 2015-03-17T11:28:29.580 回答
2

JAXB 是一个可靠的选择,因为它可以平滑地将 xml 映射到 java 类。但是还有其他可用的框架,这里是这样的一个:

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

于 2013-05-03T17:36:21.847 回答
1

我发现使用 XML beanjackson fasterxml是一种不错的选择。serializing/deserializing

参考:如何使用spring来编组和解组xml?

于 2017-11-23T05:48:05.680 回答