2014-07-09 63 views
0

考虑下面的代码内atrributes:获取密钥的值时,有在xml

use XML::Simple; 
use Data::Dumper; 

my $string_to_parse = qq(<?xml version="1.0" encoding="utf-8"?> 
         <root xmlns="sth:test"> 
         <element>1</element> 
         <element>21</element> 
         <something_else>test123</something_else> 
         </root>); 
my $xml_simple = new XML::Simple(); 
my $doc = $xml_simple->XMLin($string_to_parse); 

print "Dumping the Parsed hashref: ", Dumper($doc); 

$doc这将是包含作为键的XML元素一个hashref和作为其值,以及内的值。第一个元素(root)不是这种情况。当我们解析并转储它时,输出是:

Dumping the Parsed hashref: $VAR1 = { 
      'something_else' => 'test123', 
      'xmlns' => 'sth:test', 
      'element' => [ 
         '1', 
         '21' 
        ] 
     }; 

我怎样才能获得根元素的值呢?我对xmlns的价值没有像根元素的实际名称那么感兴趣。

+1

你试过了'$ doc - > {'xmlns'}'? – Jens

回答

2

,你必须使用keepRoot功能:

my $doc = $xml_simple->XMLin($string_to_parse, KeepRoot => 1); 
1

littleLouito的回答是速战速决。如果您阅读XML :: Simple文档,您会发现真实答案

的文档描述了status of XML::Simple

使用本模块中新代码是不鼓励。其他模块可提供更直接和一致的接口。尤其强烈建议使用XML :: LibXML。

also says

XML ::简单的是能够提出一个简单的API,因为它使代表你的一些假设。 [...]在一个严肃的XML项目中,你可能会很快超出这些假设。

在我省略的部分引用中,它列出了一些这样的假设。他们大多可以归结为“你不关心你读或写模块的XML”。

因此,更好的解决方案是从XML :: Simple(它自己的维护者阻止您在新项目中使用的模块!)切换到XML :: LibXML等良好和明智的东西。

use strict; 
use warnings; 
use XML::LibXML 2; 

my $string_to_parse = qq(<?xml version="1.0" encoding="utf-8"?> 
         <root xmlns="sth:test"> 
         <element>1</element> 
         <element>21</element> 
         <something_else>test123</something_else> 
         </root>); 

my $doc = XML::LibXML->load_xml(string => $string_to_parse); 
print $doc->documentElement->tagName, "\n"; 
+0

+1了解详情。谢谢。 – Bloodcount