我正在使用 Perl 进行一些 XML 解析并决定使用XML::DOM。假设我正在解析一个包含以下内容的文件:
<document>
<A>
<B/>
<B/>
</A>
<B/>
</document>
“B”元素根据其在文档中的相对位置进行不同的处理(即,父级为 A 的 B 与父级为文档的 B 不同)。从对文档节点的引用,是否有可能获得作为直接子节点的 B。然后稍后,获取对 A 节点的引用以仅获取其子 B 的?
谢谢,
安德鲁
另一个想法是加载XML::DOM::XPath,这使得这些类型的查询非常自然,而且不那么冗长。
@nodes = $doc->findnodes('/document/B');
@nodes = $doc->findnodes('/document/A/B');
@nodes = $doc->findnodes('//A/B');
@nodes = $doc->findnodes('//A//B');
@nodes = $doc->findnodes('/document/*/B');
还有更多!(我在那里扔了很多选项,因为从您的问题中不清楚哪些选项正是最适合您的问题的选项)。
由于所有值都只是添加了一些方法的普通 XML::DOM 对象,因此您可以轻松地与任何现有的 XML::DOM 代码混合和匹配。
假设您知道所有 B 元素都将是文档或 A 的子元素,您可以使用可选的递归参数来getElementsByTagName。传递 0 意味着只返回直接子元素:
my @docB = $doc->getElementsByTagName('B', 0);
# do something with @docB
for my $aNode ($doc->getElementsByTagName('A')) {
my @AB = $aNode->getElementsByTagName('B', 0);
# do something with @AB
}