有一种非常有用的技术可以通过SAX 框架(不是SAX 解析器,而是SAX 框架)直接从POJO 中生成 XML。此技术可用于生成 XML 文档。
从任意数据结构生成 XML
http://download.oracle.com/javaee/1.4/tutorial/doc/JAXPXSLT5.html
本质上,您向 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);
更新:
其他几个参考:
对 cmets 的一些回应:
确实如此,但是上面描述的 XMLStreamWriter 接口更加用户友好。 – Michael Kay 3 小时前
是的,但我想我并不清楚。我可以轻松地遍历层次结构并使用XMLStreamWriter 将 XML 文档直接输出到流中。 然而,这些文章展示了一种强大的技术来遍历层次结构并生成 SAX 事件,而不是直接输出 XML 文档。现在我可以插入不同的内容处理程序来执行不同的操作或生成不同版本的 XML。 我们还可以将我们的对象层次结构提供给任何接受 SAX 解析器的工具,例如 XSLT 引擎。它实际上只是利用了 SAX 框架建立的访问者模式:我们将遍历层次结构与输出 XML 分开。输出 XML 的部分,即内容处理程序,如果它们的目的是编写 XML 流,当然应该使用XMLStreamWriter。
例如,在我们的程序中,我们通过分布式组件之间的网络套接字发送 XML 消息,并且我们还使用 XSLT 生成我们的 HTML 页面。以前,我们遍历层次结构以生成 XML 文档(字符串),然后将该 XML 文档写入网络套接字或将该文档提供给 XSLT 引擎(本质上只是再次解析它)。使用这种技术之后,我们基本上可以将我们的对象层次结构(使用这个 SAX 适配器)直接提供给 XSLT 引擎,而不需要中间的 XML 字符串。能够使用一个内容处理程序为网络流生成紧凑的 XML 表示,并使用不同的内容处理程序生成打印精美的 XML 文档以写入日志文件,这也很方便。
此外,使用 SAX 解析器 API 编写 XML 是对 API 的滥用,恕我直言。 – Puce 49 分钟前
也许,但我认为这取决于您的需求。如果 OP 的要求只是写出一个特定的 XML 文档,那么这绝对是矫枉过正。但是,我认为值得一提的是,如果 OP 在他的项目中以他没有提到的其他方式使用 XML。提出另一种想法并没有什么坏处。
称其为滥用可能有点强,但我同意你有权发表你的意见。它记录在 Oracle 教程中,因此它不被 Sun/Oracle 工程师视为滥用。在我们的项目中非常成功地帮助我们满足了我们的要求,并且没有明显的缺点,所以我会将这种方法保留在我的工具箱中,以备将来使用时使用。