perl解析xml-XML::Simple/XMLin


 

轉自: http://blog.charlee.li/perl-xml-simple/

 

[Perl]用XML::Simple解析XML文件

在Perl中解析XML的方法最常見的就是使用 XML::DOM 和 XML::Simple了。 XML::DOM過於龐大,而且解析結果是一個DOM樹,操作也不方便。 
對於小型且不復雜的XML文件,XML::DOM真是殺雞用牛刀。 這時就輪到輕便的XML::Simple上場了。

XML::Simple如其名,真的很簡單。假設XML內容如下:

<opt>
    <user login="grep" fullname="Gary R Epstein" />
    <user login="stty" fullname="Simon T Tyson" >
        <session pid="12345"/>
    </user>
    <text>This is a test.</text>
</opt>

那么只需這樣寫:

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

$xml = XMLin('sample.xml');
print Dumper($xml);

就可以輕而易舉地將XML解析成一個hash,然后用foreach依次處理即可。

$VAR1 = {
          'text' => 'This is a test.',
          'user' => [
                    {
                      'fullname' => 'Gary R Epstein',
                      'login' => 'grep'
                    },
                    {
                      'session' => {
                                   'pid' => '12345'
                                 },
                      'fullname' => 'Simon T Tyson',
                      'login' => 'stty'
                    }
                  ]
        };

可以發現如下規律:

  • 元素的標簽名被用於hash的key。
  • 單個元素的內容作為hash的value,多個重復的元素的內容被放到一個數組引用中作為hash的value
  • 屬性和子元素都以hash的key=>value對出現在元素的內容中

一個問題是,對單個元素和多個重復元素的處理結果不一致,就會導致foreach處理時比較麻煩 (需要區分是標量還是數組引用),如上面的 text 和 user 的值。 解決方法是添加選項 ForceArray => 1,就可以強制單個元素也放到數組引用中。

$xml = XMLin('sample.xml', ForceArray => 1);
print Dumper($xml);

運行結果(部分):

$VAR1 = {
          'text' => [
                    'This is a test.'
                  ],
          'user' => [
......

另一個問題是,如果你的元素屬性中包含id、name或key,那么元素就不再放到數組引用中,而是放到 hash引用中。比如下面的XML,注意與上面的結果的區別:

<opt>
    <user id="grep" fullname="Gary R Epstein" />
    <user id="stty" fullname="Simon T Tyson">
        <session pid="12345"/>
    </user>
    <text>This is a test.</text>
</opt>

$VAR1 = {
          'text' => [
                    'This is a test.'
                  ],
          'user' => {
                    'grep' => {
                              'fullname' => 'Gary R Epstein'
                            },
                    'stty' => {
                              'session' => [
                                           {
                                             'pid' => '12345'
                                           }
                                         ],
                              'fullname' => 'Simon T Tyson'
                            }
                  }
        };

user的內容不再是數組引用,而是hash引用,而id='grep'也變成了key存在。

要想禁用這個功能,應當指定選項 KeyAttr => ''。這個選項就是說,解析時應該把哪些屬性作為hash的key來使用, 默認值是['id', 'name', 'key']。

在XML::Simple的文檔中, 所有的選項都有詳細說明,而KeyAttr和ForceArray選項被標為important,可見它們是多么常用了。

 

例如:

始終將testcases作為array; 將testcases下的retries作為testcases中的key;

my $ref_hash_result = XMLin($result_xml,
ForceArray => ["testcases"],
KeyAttr => {"testcases" => "retries"},
);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM