2010-08-24 61 views
1

我使用XML::Twig來解析我的輸入XML使用Perl。 我需要提取此XML中的特定節點,並驗證該節點是否有多個<p>標籤,然後計算這些P標籤中的單詞。 例如:如何使用Perl的XML :: Twig來計算XML中的多個標籤?

<XML> 
<name> 
</name> 
<address> 
<p id="1">a b c d </p> 
<p id="2">y y y </p> 
</address> 
</XML> 

輸出:

地址有2組與7個 字段的標籤。

有什麼建議嗎?

+1

爲什麼人們似乎無法得到XML是一個簡單的標準?必須*引用XML *中的屬性。否則,它只是一個相對受控的SGML。 (XML :: Twig可能仍然有效,但它不是XML。) – Axeman 2010-08-24 20:44:20

回答

4

下面是做到這一點的一種方法:

use strict; 
use warnings; 
use XML::Twig; 

my $xfile = q(
<XML> 
<name> 
</name> 
<address> 
<p id="1">a b c d </p> 
<p id="2">y y y </p> 
</address> 
</XML> 
); 

my $t = XML::Twig->new(
    twig_handlers => { 'address/p' => \&addr} 
); 
my $pcnt = 0; 
my $wcnt = 0; 
$t->parse($xfile); 
print "Address has $pcnt paragraph tags with $wcnt words.\n"; 

sub addr { 
    my ($twig, $add) = @_; 
    my @words = split /\s+/, $add->text(); 
    $wcnt += scalar @words; 
    $pcnt++; 
} 

__END__ 

Address has 2 paragraph tags with 7 words. 

XML::Twig有一個專門的網站,文檔和教程描述上文所使用的處理器技術。

+1

非常感謝答案.. workds很棒,也可以鏈接到教程! – Desai 2010-08-25 13:17:25

+0

我對這個問題有了另一個轉折,我需要轉義p標籤內的實體,這樣就不應該被計算在內。我在addr子版中嘗試的是sub addr {my($ twig,$ add)= @_;我的$ local = $ add-> text(); $ _ = $ local; s/\ &[^\;] + \; // sg; \t $ local = $ _; my @words = split/\ s + /,$ local; $ wcnt + =標量@words; $ PCNT ++; } 但上述不會取代實體..我錯過了什麼?請幫忙! – Desai 2010-08-25 19:23:51

+0

aaah ..我知道了..我錯過了這個... $ local = encode_entities($ local); – Desai 2010-08-25 19:31:53