2016-05-30 18 views
1

次のスクリプトを使用してxmlファイルの要素数を数えます。 ここの指導者のおかげで、番号を印刷できます。DOMを使用したXMLとperlの解析 - 値の検索

「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

入力ファイルに "web"という単語が含まれていないようです。 – SilentMonk

+0

申し訳ありませんが、質問を編集する場所を見つけることができませんでした。ただタイトルでプログラミングするのではなく、言葉のウェブを持っていると仮定してください。 – user6398638

+0

あなたの質問の一番下にあるタグのリストの下の行には、 'share'、' edit'、 'close'、' flag'という4つのオプションがあります。それらの1つがあなたが望むものです – Borodin

答えて

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"; 

はまた、あなたはそれらが一致するかを確認するために、異なる表現を試すことができますXPath sandboxにリンクexamples page、とXPathの詳細を学ぶことができます。