如何使用Woodstox StAX 2序列化/反序列化XML中的类

时间:2010-11-18 09:36:32

标签: java xml xml-serialization stax woodstox

我正在尝试归档,在Java中how-to-serialize-deserialize-simple-classes-to-xml-and-back(C#)中已经完成了什么。如果可能的话,我想避免为每个类编写序列化/反序列化方法。

例如,序列化的一部分:

    XMLOutputFactory xof = null;
    XMLStreamWriter2 writer = null;

    try {
        resp.setContentType("text/plain");
        xof = XMLOutputFactory.newInstance();
        writer = (XMLStreamWriter2) //
        xof.createXMLStreamWriter(resp.getOutputStream());

        writer.writeStartDocument("1.0");
        writer.writeStartElement("data");
        // 
        // Magic happens here.
        //
        writer.writeEndElement();
        writer.writeEndDocument();
    } catch (XMLStreamException e) {
        e.printStackTrace();
        resp.sendError(1, "Problem 1 occured.");
    } finally {
        try {
            writer.flush();
            writer.close();
        } catch (XMLStreamException e) {
            e.printStackTrace();
            resp.sendError(2, "Problem 2 occured.");
        }
    }

不是这个问题的一部分,因为我试图逐一解决问题,但可能会让你了解我正在尝试做什么。当我反序列化时,我还想检查输入是否有效。最终我想使用序列化形式的XSLT转换。

2 个答案:

答案 0 :(得分:4)

JAXB是将Java对象序列化为XML的方式。以下内容将帮助您入门:

JAXB实施

此标准有多种实现方式:

Woodstox StAX 2

JAXB接受许多输入/输出格式,包括StAX。

<强>验证

使用Unmarshaller将XML转换为对象,并使用Marshaller将对象转换为XML。您可以设置javax.xml.validation.Schema的实例以在这些操作期间验证输入。

您也可以直接使用JAXB使用javax.xml.validation API,请查看以下示例:

<强> XSLT

Java中使用javax.xml.transform库来执行XSLT转换。 JAXB旨在使用JAXBSource和JAXBResult来处理这些库。

了解更多信息

查看我的博客:

答案 1 :(得分:0)

除了全面接受的答案之外,值得注意的是Woodstox(或任何Stax2实现)实际上可以验证输入和输出;有关示例代码,请参阅this blog entry。一个好处是您还可以对Relax NG进行验证(默认情况下JAXB使用的JAXP解析器不支持AFAIK)或DTD。

另外:有一个名为Jackson-xml-databinder的新项目(Jackson JSON处理器的衍生产品)使用Stax2解析器(如Woodstox或Aalto)实现“mini-JAXB”(完整JAXB功能的子集) 。主要优点是比JAXB实现更强大的数据绑定部分甚至更好的性能;缺点是它不够成熟,并且不支持所有XML特定方面。在支持JSON和XML格式的情况下,它可能最有用。