如何计算perl XML :: LibXML中XML分支中的级别(深度)数?

时间:2014-10-15 13:43:20

标签: xml perl xpath libxml2 xml-libxml

我有一个非常简单的问题。我想找到XML分支的级别数。像:

<span>
 <span>
  <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline">
    <msup>
     <mn>34</mn>
     <mi>o</mi>
    </msup>
  </math>
  <span> </span>
 </span>
</span>

从第一个(根)span标记计算时,深度计数应为5。 我正在使用XML :: Libxml。 感谢。

1 个答案:

答案 0 :(得分:6)

use List::Util qw( max );

sub max_depth {
   my ($ele) = @_;
   return 1 + max 0, map max_depth($_), $ele->findnodes('*');
}

以下接受任何类型的节点而不仅仅是元素节点(例如文档节点):

use List::Util  qw( max );
use XML::LibXML qw( XML_ELEMENT_NODE );

sub max_depth {
   my ($node) = @_;
   my $base = $node->nodeType == XML_ELEMENT_NODE ? 1 : 0;
   return $base + max 0, map max_depth($_), $node->findnodes('*');
}