用perl XML::Simple解析XML檔案

來源:互聯網
上載者:User

在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,可見它們是多麼常用了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.