Perl XML:DOM - 让孩子处于特定的深度

时间:2010-12-13 01:11:06

标签: perl xmldom

我正在使用Perl进行一些XML解析并决定XML::DOM。假设我正在解析包含以下内容的文件:

<document>
   <A>
      <B/>
      <B/>
   </A>
   <B/>
</document>

“B”元素根据其在文档中的相对位置而被不同地处理(即,其父亲为A的B与其父亲为文档的B不同)。从引用到文档节点,是否可以获得直接子节点的B。然后,获取对A节点的引用以仅获得其子B的?

谢谢,

安德鲁

2 个答案:

答案 0 :(得分:4)

另一个想法是加载XML::DOM::XPath,这使得这些查询非常自然,并且不那么详细。

作为文档元素的子节点的B节点:

@nodes = $doc->findnodes('/document/B');

作为文档子级的A节点子节点的B节点:

@nodes = $doc->findnodes('/document/A/B');

B节点,它们是在任何地方出现的A节点的直接子节点:

@nodes = $doc->findnodes('//A/B');

作为任何A节点后代的B节点:

@nodes = $doc->findnodes('//A//B');

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
}