天天看点

java sax 创建xml_使用SAX和Java生成XML

小编典典

有一种非常有用的技术,可以通过 SAX框架 (不是SAX解析器,而是SAX框架)直接从POJO 生成 XML 。该技术可用于 生成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接口更加用户友好。– Michael Kay 3小时前

是的,但我想我不清楚。我可以轻松地遍历层次结构,并用于XMLStreamWriter将XML文档直接输出到流中。 但是,这些文章展示了一种遍历层次结构并生成SAX事件的强大技术,而不是直接输出XML文档。

现在,我可以插入执行不同任务或生成XML不同版本的不同内容处理程序。

我们还可以将对象层次结构提供给接受SAX解析器的任何工具,例如XSLT引擎。它实际上只是利用了SAX框架建立的访客模式:我们将遍历层次结构与输出XML分开。如果输出XML的部分(内容处理程序)XMLStreamWriter的目的是编写XML流,则应该使用。

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

此外,使用SAX解析器API编写XML是对API IMHO的滥用。– Puce 49分钟前

也许吧,但是我认为这取决于您的需求。如果OP的要求只是写出一个特定的XML文档,那么这绝对是过头的。但是,我认为值得一提的是OP是否在他的项目中以他未提及的其他方式使用XML。提出替代想法没有什么害处。

称其为 滥用 可能有些强烈,但我同意您有权提出自己的意见。它记录在Oracle教程中,因此不被Sun /

Oracle工程师认为是滥用。在我们的项目上取得了很大的成功,它可以帮助我们满足我们的要求而又没有明显的缺点,因此我会在工具箱中保留这种方法,以备将来使用。

2020-09-11