当前位置: 首页 > 面试题库 >

使用SAX和Java生成XML

安浩瀚
2023-03-14
问题内容

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


问题答案:

有一种非常有用的技术,可以通过 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);

更新:

其他一些参考:

  • 使用JAXP将旧版数据转换为XML
    http://www.devx.com/java/Article/16925

  • 使用SAX和XSLT将平面文件转换为XML
    http://www.developer.com//xml/article.php/2108031/Transforming-Flat-Files-To-
    XML-With-SAX-and-
    XSLT.htm

对评论的一些回应:

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



 类似资料:
  • SAX(Simple API for XML)是一种基于事件的XML文档解析器。 与DOM解析器不同,SAX解析器不会创建解析树。 SAX是XML的流式接口,这意味着使用SAX的应用程序接收有关正在处理的XML文档的事件通知元素和属性,从文档顶部开始按顺序排列,然后关闭ROOT元素。 从上到下读取XML文档,识别构成格式良好的XML文档的标记。 令牌的处理顺序与它们在文档中出现的顺序相同。 向应用

  • 问题内容: 我正在尝试分析堆栈溢出数据转储,其中一个表称为posts.xml,其中有大约1000万个条目。样本XML: 我想解析此xml,但仅加载xml的某些属性,例如ID,PostTypeId,AcceptedAnswerId和其他2个属性。SAX中是否有办法只加载这些属性?如果有的话怎么办?对于SAX来说我还很陌生,所以一些指导会有所帮助。 否则,加载整个程序只会很慢,而且某些属性也不会被使用

  • 问题内容: 我是使用Java和SAX解析器进行XML解析的新手。我有一个非常大的XML文件,并且由于其大小,建议使用SAX解析器。我已经完成了部分任务的解析,并且可以正常工作。现在,XML任务剩下一个任务:根据用户的请求删除/更新一些节点。 我可以按名称查找所有标签,更改其属性等。如果我可以使用SAX进行操作,则也可以删除它们。 示例XML描述了某些情况下的某些功能。用户输入是“案例”人名(,)。

  • 问题内容: 我正在尝试解析下面的文件。我想打印每个乘客的身份证和姓名。你能给我代码解析吗? 问题答案: 这是一个工作示例,尽管我建议您改用StAX,但您会发现SAX不太方便 输出

  • 问题内容: 我正在寻找一个Java库或代码来即时生成证书,公共和私有密钥,而无需使用第三方程序(例如openssl)。 我认为是从Java代码中获取keytool + openssl的东西。 考虑使用ssl和客户端身份验证保护的基于Java servlet的Web应用程序。我希望Servlet容器仅在请求时使用Java代码生成客户端证书(例如pkcs12格式)。 问题答案: 您可以使用一对或密钥在