2011-06-23 34 views
0

如何使用XMLParser的,以获得该项目中的XML内容 - > @网址,项目 - > @替换和项目 - > “内在价值”为内容的节点,在项目的字符串 - > @锥= “一”?Perl的XML解析器获取XML

<cstep> 
    <item cone="one" 
     url="http://google.com/{ccc}/cthree" 
     replace="{ccc}"> 
      <itemsub conesub="conesub"> 
        <itemsubsub conesubsub="conesubsub" /> 
      </itemsub>  
    </item> 
    <item cone="two" 
     url="http://google.com/{ccc}/cthree" 
     replace="{ccc}"> 
      <itemsub conesub="conesub"> 
        <itemsubsub conesubsub="conesubsub" /> 
      </itemsub>  
    </item> 
</cstep> 
+0

你是什么意思? – toolic

+0

基本上我试图让整个itemsub节点作为字符串 – user391986

回答

3

XML::Twig

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

my $str = <<EOF; 
    <cstep> 
     <item cone="one" 
      url="http://google.com/{ccc}/cthree" 
      replace="{ccc}"> 
       <itemsub conesub="conesub"> 
         <itemsubsub conesubsub="conesubsub" /> 
       </itemsub>  
     </item> 
     <item cone="two" 
      url="http://google.com/{ccc}/cthree" 
      replace="{ccc}"> 
       <itemsub conesub="conesub"> 
         <itemsubsub conesubsub="conesubsub" /> 
       </itemsub>  
     </item> 
    </cstep> 
EOF 

my $t = XML::Twig->new(twig_handlers => {'cstep/item' => \&item }); 
$t->parse($str); 

sub item { 
    my ($t, $item) = @_; 
    if ($item->att('cone') eq 'one') { 
     print $item->att('url' ), "\n"; 
     print $item->att('replace'), "\n"; 
    } 
} 

__END__ 

http://google.com/{ccc}/cthree 
{ccc} 

更新:要回答在评论有关分配到$url子外的问题:通过 “里面的值”

my $t = XML::Twig->new(twig_handlers => {'cstep/item' => \&item }); 
my $url; 
$t->parse($str); 
print "$url\n"; 

sub item { 
    my ($t, $item) = @_; 
    if ($item->att('cone') eq 'one') { 
     $url = $item->att('url'); 
     print $item->att('replace'), "\n"; 
    } 
} 
+1

太棒了谢谢你!我怎样才能将内容(基本上是整个节点itemsub)作为一个字符串? – user391986

+0

不客气。如文档中所示,使用'children'方法。 – toolic

+1

@ user391986获取'itemsub'的字符串使用'my $ itemsub = $ item-> first_child('itemsub') - > xml_string;' – mirod