提问人:pensee 提问时间:8/30/2023 最后编辑:ErikMDpensee 更新时间:8/30/2023 访问量:37
确定一个标记是否位于 SAX 解析器中的另一个标记中
Determine if a tag is inside another tag in SAX parser
问:
有一个 XML,我使用 SAX 解析器解析它。现在假设我在元素
的开头收到通知,此时我将知道 SAX 解析器所在的标签名称。但是我如何确定当前标签是否在名为 ?startElement(..)
A
我的想法:
一种方法是维护一个布尔变量 var insideA=false,并在收到通知时将其赋值为 true,在 .现在,当调用当前标签时,我可以检查此布尔变量是否设置为 true 或 false。
我不确定是否有其他内置方法可以做到这一点。如果必须对多个标签执行此操作,这将需要创建多个布尔变量,这可能会变得混乱。endElement(..)
startElement(..)
对替代方法有什么建议吗?
- 可能更改为 DOM 解析器或任何其他解析器可以使事情变得更容易?
答:
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()
评论