使用DOM进行XML和perl解析 - 搜索值

时间:2016-05-30 03:52:21

标签: xml perl dom

我使用以下脚本来计算xml文件中的元素数量。 感谢这里的一位大师,我可以打印这个号码。

只想知道如何添加另一个功能,它会查找单词“web”并仅打印包含该单词的单位数?

感谢。

  #!/usr/bin/perl -w 
  use strict;
  use XML::DOM; 

  my $course_file= shift;

  my $parser = new XML::DOM::Parser;

  my $course = $parser->parsefile($course_file); 

  my @units = $course->getElementsByTagName("title");


  foreach my $u (@units)
  {
    foreach my $child ($u->getChildNodes)
    {

        if ($child->getNodeName eq "internet")
        {
            $u->removeChild($child);
        }
    } 
   }

   print(scalar(@units),"\n");

示例XML:

<course>
  <name>Internet Computing</name>
  <duration>3 years</duration>
  <unit>
    <title>Programming</title>
    <lecturer>
      <surname language="English">X</surname>
    </lecturer>
  </unit>
  <unit>
    <title>Internet</title>
    <lecturer>
      <surname>S</surname>
    </lecturer>
  </unit>
</course>

1 个答案:

答案 0 :(得分:2)

XML :: DOM模块实际上不是我推荐的模块,因为它不支持XPath,并且速度不是很快。对于你想要做的事情类型,我建议一个支持XPath的模块。最常用的两个是XML :: LibXML和XML :: Twig。

我写过tutorial for using XML::LibXML,其中包含大量示例。

对于您的问题,以下内容可能符合您的要求:

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

use XML::LibXML;

my $course_file= shift;

my $dom = XML::LibXML->load_xml(location => $course_file);

my @matches = $dom->findnodes('//unit[contains(./title, "Programming")]');
my $count = @matches;

say "Total matching units: $count";

您可以使用examples page了解有关XPath的更多信息,该XPath sandbox也链接到https://github.com/angular/angular/issues/5412,您可以在其中尝试使用不同的表达式来查看它们匹配的内容。