确定一个标记是否位于 SAX 解析器中的另一个标记中

Determine if a tag is inside another tag in SAX parser

提问人:pensee 提问时间:8/30/2023 最后编辑:ErikMDpensee 更新时间:8/30/2023 访问量:37

问:

有一个 XML,我使用 SAX 解析器解析它。现在假设我在元素
的开头收到通知,此时我将知道 SAX 解析器所在的标签名称。但是我如何确定当前标签是否在名为 ?
startElement(..)A

我的想法:
一种方法是维护一个布尔变量 var insideA=false,并在收到通知时将其赋值为 true,在 .现在,当调用当前标签时,我可以检查此布尔变量是否设置为 true 或 false。
我不确定是否有其他内置方法可以做到这一点。如果必须对多个标签执行此操作,这将需要创建多个布尔变量,这可能会变得混乱。
endElement(..)startElement(..)

对替代方法有什么建议吗?

  • 可能更改为 DOM 解析器或任何其他解析器可以使事情变得更容易?
Java XML XML 解析 SAX

评论


答:

1赞 ErikMD 8/30/2023 #1

一种方法是维护布尔变量 var insideA=false, (...)

是的,这看起来像是使用 SAX 实现目标的常用方法。

对替代方法有什么建议吗?

SAX 的设置有点复杂,但在内存使用方面比 DOM / XPath “更好”。无论如何:

如果您的 XML 文档适合 RAM,

也可以尝试使用 XPath(内部基于 DOM 模型),使用起来更简单。

当您用 java 标记您的问题时,这里有一个很好的教程,用于评估 Java 中的 XPath 表达式,另请参阅官方 W3C 规范(又名推荐)这个在线 XPath 测试器

如果你的XML很大,你觉得SAX使用起来有点烦人,

您可以尝试使用 StAX,它结合了基于流的解析的性能和“拉取解析”的可用性(大致上,不再有回调)。

另请参阅此 Java 示例教程

1赞 kjhughes 8/30/2023 #2

使用 SAX 解析时,通常会构建堆栈:pushes; 啪。startElement()endElement()

然后,遏制确定是查找堆栈的简单问题。

评论

1赞 pensee 8/30/2023
但是使用堆栈,我只能检测父节点,而不能检测祖先节点。因此,如果当前元素比元素低两级,是否可以使用堆栈检测到?我认为,除非一个人遍历整个堆栈。
0赞 kjhughes 8/31/2023
@pensee:进一步窥视堆栈以检测祖先。如果你的观点是一个真正的堆栈只支持查看堆栈的顶部,那么,需要调整实现,这样你就可以进一步回头看。概念是一样的:推动和弹出每个和是主要思想。startElement()endElement()