Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Woodstox StAX 2序列化/反序列化XML中的类_Java_Xml_Xml Serialization_Stax_Woodstox - Fatal编程技术网

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

Java 如何使用Woodstox StAX 2序列化/反序列化XML中的类,java,xml,xml-serialization,stax,woodstox,Java,Xml,Xml Serialization,Stax,Woodstox,我正在尝试用Java来归档(C#)中所做的工作。如果可能,我希望避免为每个类编写序列化/反序列化方法 例如,序列化的一部分: XMLOutputFactory xof = null; XMLStreamWriter2 writer = null; try { resp.setContentType("text/plain"); xof = XMLOutputFactory.newInstance(); writer = (

我正在尝试用Java来归档(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转换和序列化形式。

JAXB是将Java对象序列化为XML的方法。以下内容将帮助您开始:

JAXB实现

本标准有几种实现方式:

  • (我是技术负责人)
  • (参考实现,包含在JavaSE6中)
Woodstox StAX 2

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

验证

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

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

XSLT

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

了解更多信息

查看我的博客:


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


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

您在这方面的知识非常丰富。感谢Margus,我已经领导XML绑定解决方案好几年了(EclipseLink MOXy)。我也是两个Java相关标准的积极成员:JAXB()和SDO()。我强烈建议您使用Java标准解决方案,因为它可以更好地与企业Java堆栈的其余部分集成。例如,JAXB是JAX-WS(XMLWeb服务)和JAX-RS(RESTfulWeb服务)的标准绑定层。如果您需要其他信息,请告诉我。@BlaiseDoughan如您所述,在使用JAXB解组时,如何设置模式实例以根据DTD验证整个xml,而不涉及创建验证程序以进行验证和分析的两个步骤?任何关于这方面的建议都会很有帮助