假设我有一个 Item Java 对象。我想将 Item 对象序列化为 XML 格式。我首先要做的是使用来自 javax.XML.bind.annotion 的一些 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"));
很简单吧?您也可以将输出 XML 通过文本 String、 Stream、 Writer、 ContentHandler 等方式传送,只需更改 Marshall (...)方法的参数,如
...
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)如下所示
...
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)。现在我要做的是注册这个模式以进行验证。
当我尝试将 XML 数据解组到 POJO 时,如果输入的 XML 不符合模式,就会捕获异常。有关完整的代码清单,请参见代码清单5(void _ 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'.]