使用 SAX 和 Java 生成 XML [已关闭]

2022-09-02 11:14:07

有谁知道一个很好的教程(或有一个很好的例子)使用SAX框架(或类似的东西)和Java编写XML?就有用的结果而言,搜索几乎没有产生什么结果。我正在尝试从Android应用程序导出,并希望尽可能避免内存开销。


答案 1

SAX 解析用于读取文档,而不是写入文档。

您可以使用 XMLStreamWriter 编写 XML:

OutputStream outputStream = new FileOutputStream(new File("doc.xml"));

XMLStreamWriter out = XMLOutputFactory.newInstance().createXMLStreamWriter(
                new OutputStreamWriter(outputStream, "utf-8"));

out.writeStartDocument();
out.writeStartElement("doc");

out.writeStartElement("title");
out.writeCharacters("Document Title");
out.writeEndElement();

out.writeEndElement();
out.writeEndDocument();

out.close();

答案 2

有一种非常有用的技术可以通过SAX框架(不是SAX解析器,而是SAX框架)直接从POJO生成XML。此技术可用于生成 XML 文档

从任意数据结构
http://download.oracle.com/javaee/1.4/tutorial/doc/JAXPXSLT5.html 生成 XML

从本质上讲,您可以将方法添加到 POJO 或为 POJO 编写实用程序类,以将它们转换为 SAX 事件发射器(在解析 XML 文档时,通常像 SAX 解析器一样发出事件)。现在,您的“SAX 事件生成器”看起来像 SAX 解析器的输出端,可以为其提供 SAX 解析器将采用的任何内容处理程序,例如打印 XML 的处理程序。但它也可以被馈送到 DOM 解析器以生成 DOM 树,或者馈送到 XSLT 引擎以生成 HTML 或执行真正的 XSL 转换,而无需首先从 POJO 生成中间 XML 文档。

例如,Person 类可能具有包含以下行的方法:emitXML()

handler.startElement(nsu, PERSON_TAG, PERSON_TAG, NO_ATTRIBUTES);

handler.startElement(nsu, FIRSTNAME_TAG, FIRSTNAME_TAG, atts);
handler.characters(this.firstName.toCharArray(), 
        0,
        this.firstName.length());
handler.endElement(nsu, FIRSTNAME_TAG, FIRSTNAME_TAG);

... emit more instance variables

... emit child object like: homeAddress.emitXML(handler, ...);

handler.endElement(nsu, PERSON_TAG, PERSON_TAG);

更新:

其他一些参考资料:


对评论的几点回应:

这是事实,但上面描述的 XMLStreamWriter 接口更加用户友好。– 迈克尔·凯 3小时前

是的,但我想我不清楚。我可以轻松遍历层次结构,并用于将 XML 文档直接输出到流。但是,这些文章展示了一种遍历层次结构和生成 SAX 事件的强大技术,而不是直接输出 XML 文档。现在,我可以插入不同的内容处理程序,这些内容处理程序执行不同的操作或生成不同版本的 XML。我们还可以将对象层次结构提供给任何接受 SAX 解析器的工具,如 XSLT 引擎。它实际上只是利用了 SAX 框架建立的访问者模式:我们将遍历层次结构与输出 XML 分开。输出 XML 的部分(即内容处理程序)当然应该使用 if,其目的是编写 XML 流。XMLStreamWriterXMLStreamWriter

例如,在我们的程序中,我们通过分布式组件之间的网络套接字发送 XML 消息,并且我们还使用 XSLT 来生成 HTML 页面。以前,我们遍历层次结构以生成 XML 文档(字符串),然后将该 XML 文档写入网络套接字或将该文档提供给 XSLT 引擎(该引擎实质上只是再次解析它)。使用此技术后,我们基本上可以将对象层次结构(使用此 SAX 适配器)直接提供给 XSLT 引擎,而无需中间 XML 字符串。能够使用一个内容处理程序为网络流生成紧凑的 XML 表示形式,并使用另一个内容处理程序生成用于写入日志文件的漂亮打印的 XML 文档,这也很方便。

此外,使用SAX解析器API编写XML是对API的误用,恕我直言。– 普切 49 分钟前

也许吧,但我认为这取决于你的需求。如果OP的要求只是写出一个特定的XML文档,那么这绝对是矫枉过正。但是,我认为值得一提的是,如果OP在他的项目中以其他方式使用XML,而他没有提到。提出另一个想法没有坏处。

称其为滥用可能有点强烈,但我同意你有权发表自己的意见。它记录在Oracle教程中,因此Sun / Oracle工程师不认为它是滥用的。它在我们的项目中非常成功,帮助我们满足了我们的要求,没有明显的缺点,所以我将把这种方法放在我的工具箱里,以备将来有用时使用。


推荐