使用Perl解析XML文件

时间:2011-03-25 15:46:07

标签: xml perl xpath

我试图从XML文件中提取两个特定属性的值,其结构如下;

<environment>
    <applications>
       <application1>
          <app-config>
             <server host="boxA" port="1234"/>
           </app-config>
       </applicaitons> 
</environment>

我希望能够读取属性“host”和“port”的值。

我尝试过使用这段代码,但这对我不起作用。

#!/usr/local/bin/perl -w

use XML::XPath;

my $file = "configuration.xml";
my $xp = XML::XPath->new(filename => $file);

my $hname = $xp->find('/environment/applications/application1/app-config/server/@host');
my $pnumber = $xp->find('/environment/applications/application1/app-config/server/@port');


print $hname;

但是当我运行此命令时,这不会返回任何输出。

提前致谢

4 个答案:

答案 0 :(得分:4)

您的XML无效!修复它,它工作正常。

$ perl test.pl
boxA

答案 1 :(得分:4)

始终,始终使用;

启动perl脚本
use strict;

在调试时,也要这样做;

use warnings;

这将向您显示您的XML格式不正确。

修复您的XML,它会起作用!

答案 2 :(得分:2)

</applicaitons>拼写为</applications> 将其替换为XML文档中的内容。 来源很好。

答案 3 :(得分:0)

使用XML:简单。它很简单。

尝试以下代码:

use strict;
use warnings;
use XML::Simple;
my $xml = XMLin( <<XML );
<environment>
    <applications>
       <application1>
          <app-config>
             <server host="boxA" port="1234"/>
           </app-config>
       </applicaitons> 
</environment>
XML
print $xml->{"applications"}{"app-config"}{"server"}{"host"} . "\n";
print $xml->{"applications"}{"app-config"}{"server"}{"port"} . "\n";
在您的XML代码段上

,您将收到错误,例如:

mismatched tag at line 7, column 9, byte 159 at C:/Perl64/lib/XML/Parser.pm line 187

因为它告诉我标签不匹配,所以我开始检查XML,直到我解决了格式错误的问题,因此我处理XML错误,直到我提出:

use strict;
use warnings;
use XML::Simple;
my $xml = XMLin( <<XML );
<environment>
    <applications>
          <app-config>
             <server host="boxA" port="1234"/>
           </app-config>
       </applications> 
</environment>
XML
print $xml->{"applications"}{"app-config"}{"server"}{"host"} . "\n";
print $xml->{"applications"}{"app-config"}{"server"}{"port"} . "\n";

现在程序产生了预期的结果:

boxA
1234

正如你所看到的,它帮助我快速发现了错误的来源,并且没有额外的配置XML :: Simple对我们都非常喜欢的perl哈希进行了非常自然的映射:-) ...简单。