1

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

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

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

谢谢,

安德鲁

4

2 回答 2

4

另一个想法是加载XML::DOM::XPath,这使得这些类型的查询非常自然,而且不那么冗长。

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

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

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

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

作为 A 节点的直接子节点的 B 节点出现在任何地方:

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

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

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

B 节点在它们和文档之间有任何一个(确切地说是一个)祖先:

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

还有更多!(我在那里扔了很多选项,因为从您的问题中不清楚哪些选项正是最适合您的问题的选项)。

由于所有值都只是添加了一些方法的普通 XML::DOM 对象,因此您可以轻松地与任何现有的 XML::DOM 代码混合和匹配。

于 2010-12-13T05:05:54.663 回答
2

假设您知道所有 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
}
于 2010-12-13T01:25:47.263 回答