将xml表示为java类

Par*_*war 3 java xml

可能这个问题可能会被问到.我是将xml转换为java类的新手.我有一个像这样的xml:

<Root>
    <Book name="harel" price="5" />
    <Book name="xml" price="9" />
</Root>
Run Code Online (Sandbox Code Playgroud)

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

bdo*_*han 6

注意: 我是EclipseLink JAXB(MOXy)的负责人,也是JAXB(JSR-222)专家组的成员.

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

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

<JAVA_HOME>/bin/xjc
Run Code Online (Sandbox Code Playgroud)

可以在此处找到从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;

}
Run Code Online (Sandbox Code Playgroud)

package forum11213872;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Book {

    @XmlAttribute
    private String name;

    @XmlAttribute
    private int price;

}
Run Code Online (Sandbox Code Playgroud)

演示

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

}
Run Code Online (Sandbox Code Playgroud)

input.xml中/输出

<Root>
    <Book name="harel" price="5" />
    <Book name="xml" price="9" />
</Root>
Run Code Online (Sandbox Code Playgroud)

  • 嗨Blaise.我想说谢谢你的努力.我之前使用JAXB作为Jersey REST服务,它是一个很棒的工具(除了一个小问题,我们使用的是Hibernate,我不得不处理由于我们的对象相互关联的方式导致的转换中的一些无限循环 - 我们的错) (2认同)
  • @mihaisimi - 我很高兴听到我得到了帮助.您可能对EclipseLink JAXB(MOXy)中的`@ XmlInverseReference`注释感兴趣,以处理该用例:http://blog.bdoughan.com/2010/07/jpa-entities-to-xml-bidirectional.html (2认同)
  • 谢谢,我会看看你的建议.我使用@XmlId和XmlIdRef来解决问题. (2认同)