java - 如何从 XML 文件创建对象图?

标签 java xml object

我有一个 XML 文件。它可能是这样的:

<person>
  <name>
    <firstname>Joni</firstname>
    <lastname>Smith</lastname>
  </name>
  <born year="1983" day="31" month="01">Finland</born>
  ... lots of elements ...
</person>

我的目标是创建类 Person。我怎样才能“自动”做到这一点?我想我已经使用一些 Maven Castor 插件从 XML 文件创建了一个非常复杂的对象图,而不需要很多努力。但是,我不记得那个插件是什么,也确实不记得我究竟是如何使用它的。我也很高兴了解您可能知道的其他(可能更好的)工具。

最佳答案

我同意使用 JAXB。

Starting from XML Schema(从 XML 模式生成类)

您可以使用 JAXB 从 XML 模式生成 Java 源代码。以下是使用 EclipseLink JAXB (MOXy) 执行此操作的说明:

Java SE 6 带有 Metro JAXB XJC 编译器,它可以在 JDK 安装的 bin 目录中找到:

C:\Program Files\Java\jdk1.6.0_20\bin>xjc -d outputDir mySchema.xsd

Eclipse 中的 Dali 插件也有此支持,请参阅 JAXB 类生成部分:

从对象开始

对于您的对象模型,您可能会发现 MOXy JAXB 中基于 XPath 的映射扩展非常有用:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {

    @XmlPath("name/firstname/text()")
    private String firstName;

    @XmlPath("name/lastname/text()")
    private String lastName;

    // ...
}

可与以下演示代码一起使用以处理您的 XML:

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Person person = (Person) unmarshaller.unmarshal(new File("input.xml"));

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

有关基于 XPath 的映射的更多信息,请参阅:

对于“出生”元素,您可能会发现 JAXB 的 XmlAdapter 很有帮助:

关于java - 如何从 XML 文件创建对象图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3884814/

相关文章:

java - Docker - Maven 在运行时连接到特定的存储库

xml - XSLT 在不同元素中设置来自另一个 XML 文件的属性值

powershell - 从 foreach powershell 的返回变量创建一个对象

java - 我应该返回什么而不是 null?

JAVA RandomAccessFile 构造时抛出 IOException

java - WebDriver 和 FirefoxDriver 的区别

Python self 复制类

java - 对于在 onCreate() 中创建的类,卡在 Java.lang.VerifyError

sql - 查询具有多个子实体的 XML

c++ - Qt QLinkedList 对象追加问题