【问题标题】:how to parse xml to java object? [closed]如何将xml解析为java对象? [关闭]
【发布时间】:2013-04-28 04:33:18
【问题描述】:

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

我在 Google 上做了一些研究,知道 JAXB 是一种选择,我的应用程序只是一些读取规则然后执行操作的工具程序,JAXB 可以更广泛地用于 Web 服务,它适合我的项目吗?

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

【问题讨论】:

  • 这完全取决于 XML 的编写方式。如果使用现有的 XML bean 工具,请继续使用该工具。否则,您将不得不自己解析它并构建自己的对象。太宽泛了。

标签: java xml


【解决方案1】:

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

检查结果,修复错误!

【讨论】:

  • 所以在这种情况下,我可以在我的系统中使用 Customer 作为 pojo,我不需要创建新的纯 java pojo 类 Customer 没有注释?
  • 当然,这就是想法,您从 xml 读取客户并继续按原样使用它。
  • @EvgeniyDorofeev 您好,我遇到了这个类似问题的问题,我需要保存具有相同标签名称的子节点。 stackoverflow.com/questions/41875849/…
  • 这给出了 JAXBException: doesn't contain ObjectFactory.class or jaxb.in​​dex.
  • @user2914191 有什么问题?版本之间不要盲目升级。
【解决方案2】:

使用 JAXB 执行 Unmarshall:

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

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

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

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

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

快乐编码 !!

【讨论】:

    【解决方案3】:

    考虑到您有一个 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")
    

    一个元素&lt;NAME&gt;..&lt;/NAME&gt;的setter方法上面的注释会失败,说一个变量上不能有两个元素。

    希望对你有帮助。

    【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 不太可靠,因为我的所有代码在 java 11 升级后都损坏了,并且没有简单的解决方案
    【解决方案5】:

    我发现jackson fasterxmlserializing/deserializing bean 与 XML 的一个不错的选择。

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

    【讨论】:

      猜你喜欢
      • 2015-01-16
      • 2012-02-11
      • 2016-12-02
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多