2011-04-13 64 views
3

我玩弄XML :: Twig库在Perl中,我不太清楚如何(或者甚至)我可以做到以下几点。我还没有完成代码,因为我甚至不知道从哪里开始。我真的想过一些想法,我可以(希望)从那里...Perl XML :: Twig问题请

所以我想用XML :: Twig来找到值“This_Is_My_Name”,这是标签“MyClass.Name”的子值, 。我认为我可以做这个部分,但指导将不胜感激。

然后我想要得到“MyClass.Code”LinkValue数字,在下面的例子中是“987654321”。

希望是有道理的。所以我不知道如何以这种方式四处走动。

请帮助:)

所以我的XML文档如下,

<Object Class="MyClass" Id="123456789"> 
    <Property Name="MyClass.Link"> 
     <LinkValue> 
      <Id>2468</Id> 
     </LinkValue> 
    </Property> 
    <Property Name="MyClass.Code"> 
     <LinkValue> 
      <Id>987654321</Id> 
     </LinkValue> 
    </Property> 
    <Property Name="MyClass.Name"> 
     <StringValue>This_Is_My_Name</StringValue> 
    </Property> 
</Object> 

回答

9

可以使用的XPath来提取这些值。 This_Is_My_Name的xpath为/Object/Property[@Name="MyClass.Name"]/StringValueLinkValue的为x /Object/Property[@Name="MyClass.Code"]/LinkValue/Id。该代码将是:

use XML::Twig; 

my $twig = XML::Twig->new(); 

# parse the file 
$twig->parsefile("x.xml"); 

# look for StringValue 
@nodes=$twig->findnodes('/Object/Property[@Name="MyClass.Name"]/StringValue'); 
$stringVal=pop(@nodes)->text(); 
print $stringVal."\n"; 

# look for LinkValue 
@nodes=$twig->findnodes('/Object/Property[@Name="MyClass.Code"]/LinkValue/Id'); 
$linkVal=pop(@nodes)->text(); 
print $linkVal; 
+0

谢谢:)我试试吧! – jo82 2011-04-13 13:02:11

+0

获取以下错误,任何提示? 无法在C:/ strawberry/perl/site/l上的未定义值上调用方法“get_xpath” ib/XML/Twig.pm 3353行。 – jo82 2011-04-13 13:29:30

+0

该代码适用于我 – mirod 2011-04-13 16:47:02

4

在这种情况下,而不是使用XPath,我通常使用树遍历方法。这里first_elt找到属性,然后field(相当于first_child()->text)来获取链接值。

#!/usr/bin/perl 

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

my $twig = XML::Twig->new(); 

# parse the file 
$twig->parsefile("so.xml"); 

# look for StringValue 
my $property= $twig->first_elt('Property[@Name="MyClass.Code"]'); 
my $link= $property->field('LinkValue'); 
print $link;