Java 上下文 sax / stax 解析

Posted

技术标签:

【中文标题】Java 上下文 sax / stax 解析【英文标题】:Java contextual sax / stax parsing 【发布时间】:2011-07-21 04:08:09 【问题描述】:

我想将直接作为子节点出现的所有文本元素提取到根节点。我使用DefaultHandler 浏览了java 标准萨克斯风。但它似乎不是 path 感知的。

问题是获取first-level only 节点,而不是extracting only text-nodes。

是否有任何非面向 DOM 的方法来做到这一点? (注意,节点名称事先不知道)

[编辑]

示例输入

<root>
   <a>text1</a>
   <b>text2</b>
   <c>text3</c>
   <nested>
       <d>not_text4</d>
       ...
   <nested>
   ...
</root>

样本输出

Map<String, String> map := 
    a, text1
    b, text2
    c, text3


目前已解决为面向 DOM 的解决方法。尽管存在为 SAX / STAX 提供 xpath 表达式子集的库。

【问题讨论】:

如果您添加一些示例输入 xml 和预期结果,我们可以更好地帮助您。 @Don Roby,当然。问题已更新 【参考方案1】:

SAX 和 StAX 本质上确实不是路径感知的,因为它们是面向事件的。虽然实现跟踪解析级别的处理程序当然是可能的,但您最好使用XPath。

一种更复杂的策略可能是编写一个 XSLT 转换,它只保留您所追求的元素,然后使用 SAX 或 Stax 处理结果。

【讨论】:

恐怕你是对的。好消息是streamig xpath 可能有办法 @Johan - 是的,这可能有效。另请参阅我的更新以了解不需要加载整个文档的另一种可能性。【参考方案2】:

这会有点开销,但是你会得到一个强大的工具来处理 xml。试试JAXB。

【讨论】:

谢谢,虽然我需要有效地提取 xml 文档中所有 first-level 元素的List&lt;String&gt;,而不是将它们转换为 java 对象。

以上是关于Java 上下文 sax / stax 解析的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该选择 SAX 而不是 StAX?

为啥 sax 解析比 dom 解析快?以及 stax 是如何工作的?

XML编程总结——使用StAX接口操作xml

XML解析之PULL

XML解析之PULL

笔记:XML-解析文档-流机制解析器(SAXStAX)