我正在使用Perl进行一些XML解析并决定XML::DOM。假设我正在解析包含以下内容的文件:
<document>
<A>
<B/>
<B/>
</A>
<B/>
</document>
“B”元素根据其在文档中的相对位置而被不同地处理(即,其父亲为A的B与其父亲为文档的B不同)。从引用到文档节点,是否可以获得直接子节点的B。然后,获取对A节点的引用以仅获得其子B的?
谢谢,
安德鲁
答案 0 :(得分:4)
另一个想法是加载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代码。
答案 1 :(得分:2)
假设您知道所有B元素都是文档或A的子元素,您可以使用可选的recurse参数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
}