【问题标题】:represent xml as java classes将 xml 表示为 java 类
【发布时间】:2012-06-28 03:45:55
【问题描述】:

可能有人问过这个问题。我是 xml 到 java 类转换的新手。 我有一个这样的 xml:

<Root>
    <Book name="harel" price="5" />
    <Book name="xml" price="9" />
</Root>

有没有办法为这样的结构动态生成 java 类? 一个小的更正,我没有 xml 的 xsd

【问题讨论】:

  • 动态?如果您在编译时不知道这些类,您想对它们做什么?

标签: java xml


【解决方案1】:

注意:我是EclipseLink JAXB (MOXy) 领导,也是JAXB (JSR-222) 专家组的成员。

有没有办法为结构动态生成 java 类 像这样?

JAXB 实现提供了从 XML 模式生成 Java 模型的能力。从 Java SE 6 开始包含在 JDK 中的参考实现可在以下位置获得:

<JAVA_HOME>/bin/xjc

可以在此处找到从 XML 模式生成对象模型的示例:

一个小修正,我没有用于 xml 的 xsd

如果您没有 XML 架构,您可以找到一个实用程序来从 XML 文档生成 XML 架构:

或者从代码开始。


从代码开始

您也可以从代码开始并注释您的模型以映射到现有的 XML 结构。

package forum11213872;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement(name="Root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlElement(name="Book")
    private List<Book> books;

}

图书

package forum11213872;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Book {

    @XmlAttribute
    private String name;

    @XmlAttribute
    private int price;

}

演示

package forum11213872;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum11213872/input.xml");
        Root root = (Root) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}

input.xml/Output

<Root>
    <Book name="harel" price="5" />
    <Book name="xml" price="9" />
</Root>

【讨论】:

  • 嗨,布莱斯。我想说谢谢你的努力。我之前曾将 JAXB 用于 Jersey REST 服务,它是一个很棒的工具(除了一件小事,我们使用的是 Hibernate,我不得不处理由我们的对象相互链接的方式引起的转换中的许多无限循环 -我们的错)
  • @mihaisimi - 我很高兴听到我提供了帮助。您可能对我们在 EclipseLink JAXB (MOXy) 中用于处理该用例的 @XmlInverseReference 注释感兴趣:blog.bdoughan.com/2010/07/…
  • 谢谢,我会看看你的建议。我已经使用@XmlId 和 XmlIdRef 来解决这个问题。
  • 感谢您的程序,我想要的是,我想通过 java 类访问 xml 的属性。我不知道这是否可能。我会详细解释我的需求。我有一些值的java对象。我想将该对象与 xml 文件进行比较。所以,基本上如果我可以将 xml 文件转换为 java 对象,那会很有帮助
【解决方案2】:

使用JAXB,它现在包含在JavaSE 中,您可以使用XJC 从XSD 生成类。但是,如果您真正的意思是动态的,因为直到运行时才知道 XML 的结构,您将需要使用类似 JDOM 的东西。

【讨论】:

    【解决方案3】:

    看看XStream

    它在 XML 和 Java 之间以及 Java 和 XML 之间进行转换。

    【讨论】:

      【解决方案4】:

      试试 Java Castor。您可以指定 xsd 并将其转换为对象。还有一个 Eclipse 插件。

      http://www.castor.org/

      【讨论】:

        【解决方案5】:

        是的,请参阅 castor 框架 (http://www.castor.org/) 或 jaxb (http://www.oracle.com/technetwork/articles/javase/index-140168.html)

        【讨论】:

          猜你喜欢
          • 2023-03-08
          • 1970-01-01
          • 2017-11-07
          • 1970-01-01
          • 1970-01-01
          • 2015-07-30
          • 1970-01-01
          • 2019-02-17
          • 1970-01-01
          相关资源
          最近更新 更多