使用perl解析一个特殊的xml文件

使用perl解析一个特殊的xml文件,xml,perl,parsing,Xml,Perl,Parsing,我正在尝试解析下面的xml文件,并获取bBranch、Branch <xml-fragment xmlns:con="http://some web link"> <con:properties> <con:string name="bBranch" value="in" export="never" /> <con:string name="Branch" value="in" export="never" /&g

我正在尝试解析下面的xml文件,并获取bBranch、Branch

<xml-fragment xmlns:con="http://some web link">
  <con:properties>

        <con:string name="bBranch" value="in" export="never" />
        <con:string name="Branch" value="in" export="never" />

        <con:boolean name="cBranch" value="0" export="never" />
  </con:properties>
</xml-fragment>
输出:- 无法在./test2.pl第6行对未定义的值调用方法“getNodeValue”

我是不是错过了什么或者走错了方向

请帮忙。 提前谢谢

:更新:

如果要按如下方式更改xml文件

<xml-fragment xmlns:con="http://some web link">
  <con:properties>           
        <con:string name="Branch" value="Batman" export="never" />
        <con:boolean name="cBranch" value="$Branch" export="never" />
  </con:properties>
</xml-fragment>


如何获取
cBranch
的值,以便它将获取
$Branch
Batman

当您要在中使用名称空间时,需要使用:

稍微短一点:


如果要在中使用名称空间,则需要使用:

稍微短一点:


问题是
$entry->getElementsByTagName('con:string')
返回一个数组,因此您需要在已有的数组中插入第二个循环。所以你可以这样做:

foreach my $entry ($doc->getElementsByTagName('con:properties')) {
        foreach my $elem ($entry->getElementsByTagName('con:string')) {
                my $name = $elem->getAttribute('name');
                my $value = $elem->getAttribute('value');
                print "$name = $value\n";
    }
}

请注意,从xml文档中提取这样的信息非常繁琐,因此您可能需要寻找一种允许您使用xpath访问文档部分的解决方案。另请参见choroba的答案。

问题在于
$entry->getElementsByTagName('con:string')
返回一个数组,因此您需要在已有的数组中插入第二个循环。所以你可以这样做:

foreach my $entry ($doc->getElementsByTagName('con:properties')) {
        foreach my $elem ($entry->getElementsByTagName('con:string')) {
                my $name = $elem->getAttribute('name');
                my $value = $elem->getAttribute('value');
                print "$name = $value\n";
    }
}

请注意,从xml文档中提取这样的信息非常繁琐,因此您可能需要寻找一种允许您使用xpath访问文档部分的解决方案。另请参见choroba的答案。

XML::LibXML教程有一页关于XML::LibXML教程有一页关于
open above.xml ;
register-namespace con http://some%20web%20link ;
echo //con:properties/con:string/@name ;
foreach my $entry ($doc->getElementsByTagName('con:properties')) {
        foreach my $elem ($entry->getElementsByTagName('con:string')) {
                my $name = $elem->getAttribute('name');
                my $value = $elem->getAttribute('value');
                print "$name = $value\n";
    }
}