如果您想在 5 分钟内开始将 Java 编码到 XML 和 XML 到 Java,请尝试简单 XML 序列化。不要花时间学习 JAXB API
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
但是,如果您真的热衷于学习 JAXB,这里有一个很棒的教程
http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
教程内容:
JAXB 用于简单的 Java-XML 序列化
在 Java 中有多种方法可以进行 XML 序列化。如果您想对解析和序列化进行细粒度控制,您可以使用 SAX、DOM 或 Stax 以获得更好的性能。然而,我经常想做的是 POJO 和 XML 之间的简单映射。但是,手动创建 Java 类来进行 XML 事件解析并非易事。我最近发现 JAXB 是一种快速方便的 Java-XML 映射或序列化。
JAXB 包含很多有用的功能,您可以在此处查看参考实现。 Kohsuke's Blog 也是了解更多有关 JAXB 的好资源。对于这篇博文,我将向您展示如何使用 JAXB 进行简单的 Java-XML 序列化。
POJO 转 XML
假设我有一个 Item Java 对象。我想将 Item 对象序列化为 XML 格式。我首先要做的是使用 javax.xml.bind.annotation.* 包中的一些 XML 注释来注释这个 POJO。参见 Item.java 的代码清单 1
来自代码
-
@XmlRootElement(name="Item") 表示我想成为根元素。
-
@XmlType(propOrder = {"name", "price"}) 表示我希望元素在 XML 输出中的排列顺序。
-
@XmlAttribute(name="id", ...) 表示 id 是根元素的属性。
-
@XmlElement(....) 表示我希望 price 和 name 成为 Item 中的元素。
我的Item.java 已准备就绪。然后我可以继续创建用于编组 Item 的 JAXB 脚本。
//creating Item data object
Item item = new Item();
item.setId(2);
item.setName("Foo");
item.setPrice(200);
.....
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
//I want to save the output file to item.xml
marshaller.marshal(item, new FileWriter("item.xml"));
完整的代码清单请参见代码清单 2main.java。将创建输出代码清单 3 item.xml 文件。它看起来像这样:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item">
<ns1:itemName>Foo</ns1:itemName>
<ns1:price>200</ns1:price>
</ns1:item>
简单吧?您也可以通过简单地更改 marshal(...) 方法的参数(如
...
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
// save xml output to the OutputStream instance
marshaller.marshal(item, <java.io.OutputStream instance>);
...
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
StringWriter sw = new StringWriter();
//save to StringWriter, you can then call sw.toString() to get java.lang.String
marshaller.marshal(item, sw);
XML 到 POJO
让我们反转这个过程。假设我现在有一段 XML 字符串数据,我想把它变成 Item.java 对象。 XML 数据(代码清单 3)看起来像
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item">
<ns1:itemName>Bar</ns1:itemName>
<ns1:price>80</ns1:price>
</ns1:item>
然后我可以将这个 xml 代码解组为 Item 对象
...
ByteArrayInputStream xmlContentBytes = new ByteArrayInputStream (xmlContent.getBytes());
JAXBContext context = JAXBContext.newInstance(Item.getClass());
Unmarshaller unmarshaller = context.createUnmarshaller();
//note: setting schema to null will turn validator off
unmarshaller.setSchema(null);
Object xmlObject = Item.getClass().cast(unmarshaller.unmarshal(xmlContentBytes));
return xmlObject;
...
完整的代码清单请参见代码清单 2 (main.java)。 XML 源可以来自 Stream 和文件的多种形式。同样,唯一的区别是方法参数:
...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);
使用 XML 架构进行验证
我想在这里提到的最后一件事是在解组到 Java 对象之前使用模式验证输入 XML。我创建了一个名为 item.xsd 的 XML 模式文件。有关完整的代码清单,请参阅代码清单 4 (Item.xsd)。现在我要做的是注册这个模式进行验证。
...
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new File("Item.xsd"));
unmarshaller.setSchema(schema); //register item.xsd shcema for validation
...
当我尝试将 XML 数据解组到 POJO 时,如果输入的 XML 不符合架构,则会捕获异常。完整的代码清单请参见代码清单 5 (invalid_item.xml)。
javax.xml.bind.UnmarshalException
- with linked exception:
javax.xml.bind.JAXBException caught: null
[org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: 'item1' is
not a valid value for 'integer'.]
这里我将 'id' 属性改为字符串而不是整数。
如果 XML 输入对模式有效,则 XML 数据将成功解组到 Item.java 对象。