gpt4 book ai didi

java - 使用 SAX 解析器确定是否在叶节点

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:41 25 4
gpt4 key购买 nike

使用 org.xml.sax.helpers.DefaultHandler,您能否确定您是否位于 endElement(String, String, String) 中的叶节点?

或者您是否需要使用 DOM 解析器来确定这一点?

最佳答案

让我们从一些基本定义开始:

An XML document is an ordered, labeled tree. Each node of the tree is an XML element and is written with an opening and closing tag.

(来自 here)。最重要的是:这意味着 XML 文件具有非常规则、简单的结构。例如,leaf 节点的定义就是:一个没有任何子节点的节点。

现在:只要 SAX 解析器遇到节点的 closing 标记,就会调用 endElement() 方法。假设您的 XML 具有有效内容,这也意味着解析器之前给了您相应的 startElement() 调用!

换句话说:您可以使用确定是否“结束”叶节点所需的所有信息:

  • 你被告知哪些元素是“开始的”
  • 你被告知哪些元素结束

举个例子:

<outer>
<inner/>
</outer>

这将导致这样的事件/回调序列:

  • 事件:开始元素外层
  • 事件:开始元素内部
  • 事件:结束元素内部
  • 事件:结束元素外层

因此,“显然”,当您的解析器记住事件的历史时,确定innerouter 中的哪一个是叶节点是直截了当!

因此,答案是:不,您不需要 DOM 解析器。最后,无论如何,DOM 都是根据完全相同的信息构建的!如果 DOM 解析器可以推断出对象的“范围”,那么您的 SAX 解析器也可以。

但仅作记录:您仍然需要仔细实现跟踪“开始”、“打开”和“结束”标签的数据结构,例如正确确定这个标签:

<outer> <inner> <inner/> </inner> </outer>

代表两个非叶子节点(outer和第一个inner),和一个叶子节点(inner inner)。

关于java - 使用 SAX 解析器确定是否在叶节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55658810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com