2011-03-25 95 views
3

我想从XML文件中提取两个特定属性的值,其结构在下面;使用Perl解析XML文件

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

我希望能够读取属性“主机”和“端口”的值。

我已经尝试了一段代码,但这不适用于我。

#!/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; 

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

在此先感谢

+6

我只想说,你是一个呼吸新鲜空气。感谢您使用XML解析器解析XML,而不是使用正则表达式! – CanSpice 2011-03-25 16:40:53

回答

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 ::简单做了一个非常自然的映射到Perl的哈希说我们都很喜欢:-) ...简单。

+4

这是为了简单的XML(并且大多数XML不够简单) – Quentin 2011-03-25 15:53:47

+0

好吧,我通过反对票的提示来阐述。我并不反对@David,但XML :: Simple可以很好地适用于很多XML,如果您需要,您可以开始编写这些选项并使用更多的XML。如果您正在寻求扩展或使用一些非常复杂的XML,那么可能需要迁移到其他模块。但是,看起来这很容易! – harschware 2011-03-26 03:51:11

+0

我怀疑downvotes是因为切换XML模块不能解决问题(这是XML格式错误)。 – Quentin 2011-03-26 07:17:09

4

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

$ perl test.pl 
boxA 
+1

更正您的应用程序标签以及关闭application1标签。 – 2011-03-25 16:07:12

4

总是,总是用你的perl脚本启动;

use strict; 

而且在调试时也做到这一点;

use warnings; 

这会告诉你,你的XML格式不正确。

修复你的XML,它会工作!

+0

实际上,即使没有设置警告/严格,它总是显示错误。 – 2011-03-25 17:29:15

+0

我确实错过了shebang系列中的-w开关,公正的警察。我坚持使用严格的评论,虽然;-) – Roger 2011-03-25 23:13:38

2

</applicaitons>应该拼写为</applications> 将其替换为您的XML文档。 来源很好。

+0

哈哈哈。所以看来我的xpath是错误的,而不是XML本身。发现了下划线和短划线之间的差异。谢谢大家的帮助! ;) – sandster007 2011-03-25 16:05:16

+1

在你问的问题中,你的XML是错误的,修正后,你现有的XPath就没有问题了。无论哪种方式,很高兴你排序。 – Roger 2011-03-25 23:11:59