我一直在寻找将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")
类似的东西,或者至少类似的东西。有没有这样的事情?
答案 0 :(得分:3)
下面是如何使用JAXB(JSR-222)完成此操作。 Java SE 6中包含一个实现。还有其他实现,例如EclipseLink MOXy(我是技术主管)。
简短回答
您可以使用以下API调用JAXB以及任何注释或XML模式。
Sitemap sitemap = JAXB.unmarshal(xml, Sitemap.class);
LONG ANSWER
下面是一个更详细的例子。
<强>网页强>
我稍微修改了你的课程。我不确定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是一个线程安全对象,表示所有已初始化的元数据。 Marshaller
和Unmarshaller
个对象提供了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);
}
}
<强> 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>
了解更多信息
答案 1 :(得分: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。