java - 没有问题的 XML 到 Java 绑定(bind)

标签 java xml data-binding

我到处寻找将 XML 元素绑定(bind)到 Java 类的好方法。这听起来像是一件相当容易实现的事情(对于一些简单的值(value)),但无论我看什么,都需要 XSD、显式映射和其他一些真正妨碍我的事情。

这是我(可能不完整)关于表示站点地图的 Java 对象的想法。

public class Sitemap {

    private List<Url> urls;

    public List<Url> getUrls() {
        return urls;
    }

    public void setUrls(List<Url> urls) {
        this.urls = urls;
    }
}

我正在寻找可以让我做的事情:

Sitemap sitemap = (Sitemap) Foo.fromXml("sitemap.xml")

类似的东西,或者至少类似的东西。有这种东西吗?

最佳答案

下面是如何使用 JAXB ( JSR-222 ) 完成的。 Java SE 6 中包含一个实现。还有其他实现,例如 EclipseLink MOXy (我是技术主管)。

简短回答

您可以将以下 API 调用与带有任何注释或 XML 模式的 JAXB 一起使用。

Sitemap sitemap = JAXB.unmarshal(xml, Sitemap.class);

长答案

下面是一个更详细的例子。

站点地图

我稍微修改了你的类(class)。我不确定 Url 类是什么,所以我将它更改为 java.net.URL。请注意域模型上不需要注释。

package forum10854001;

import java.net.URL;
import java.util.List;

public class Sitemap {

    private List<URL> urls;

    public List<URL> getUrls() {
        return urls;
    }

    public void setUrls(List<URL> urls) {
        this.urls = urls;
    }
}

演示

我创建了一个 JAXBContext,而不是简短回答中使用的代码。 JAXBContext 是一个线程安全对象,代表所有已初始化的元数据。 MarshallerUnmarshaller 对象提供了比 JAXB 类更多的灵 active 。

下面的代码演示了如何读入 XML 并将其写回:

package forum10854001;

import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StreamSource xml = new StreamSource("src/forum10854001/input.xml");
        JAXBElement<Sitemap> jaxbElement = unmarshaller.unmarshal(xml, Sitemap.class);

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

    }

}

input.xml/输出

<?xml version="1.0" encoding="UTF-8"?>
<sitemap>
    <urls>http://www.eclipse.org/eclipselink/moxy.php</urls>
    <urls>http://jaxb.java.net</urls>
</sitemap>

了解更多信息

关于java - 没有问题的 XML 到 Java 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10854001/

相关文章:

android - 找不到带有参数的属性的 setter

android - 以 viewModel 作为数据绑定(bind)变量重用 Fragments/Bottomsheets

java - 如何在javafx webkit中添加文件为://. ..的本地img

java - 在 Apache Kafka 中存储图像?

php - 在 PHP 中使用 DOMXPath 获取 XML 属性,忽略命名空间

java - Spring 如何从类路径中找到 XSD 文件

java - 使用 Java 的照片缩放器

java - YouTube 数据 API 中缺少execute() 方法

Java Transformer 类在转换时重复一些 xml 节点属性

wpf - 依赖属性和数据绑定(bind)?