3

我到处寻找将 XML 元素绑定到 Java 类的好方法。这听起来是一件相当容易实现的事情(对于一些简单的价值),但无论我看哪里,都需要 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")

类似的东西,或者至少类似的东西。有没有这样的事情?

4

2 回答 2

3

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

简短的回答

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

Sitemap sitemap = JAXB.unmarshal(xml, Sitemap.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类的额外灵活性。

下面的代码演示了如何读取 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);

    }

}

输入.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>

了解更多信息

于 2012-06-01T17:11:30.340 回答
1

您也可以考虑XStream。下面是与 Blaise 的代码大致等效的代码,尽管为了多样化而以相反的方向工作(从 Object 开始,而不是 XML):

public class Sitemap{
      private List<URL> urls = new ArrayList();

      // I left out the setters and getters

      public static void main(String[] args) throws IOException {
         Sitemap sitemap = new Sitemap();
         sitemap.urls.add(new URL("http://www.eclipse.org/eclipselink/moxy.php"));
         sitemap.urls.add(new URL("http://jaxb.java.net"));

         XStream xs = new XStream(new DomDriver());
         String xmlString = xs.toXML(sitemap);
         System.out.println(xmlString);
         Sitemap readBack = (Sitemap) xs.fromXML(xmlString);
      }
   }

产生以下输出:

<com.your.name.here.Sitemap>
  <urls>
    <url>http://www.eclipse.org/eclipselink/moxy.php</url>
    <url>http://jaxb.java.net</url>
  </urls>
</com.your.name.here.Sitemap>

您可以在调试器中设置断点并查看 readBack,它具有两个 URL。

于 2012-06-01T17:33:57.987 回答