首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将XML数据解析为不同的结构

将XML数据解析为不同的结构
EN

Stack Overflow用户
提问于 2016-06-06 22:30:08
回答 1查看 54关注 0票数 2

我有下面的XML文件,我正试图解析它

代码语言:javascript
复制
<Books>
  <book name="first" feed="contentfeed" mode="modes" />
  <book name="first" feed="communityfeed" mode="modes" region="1"/>
  <book name="second" feed="contentfeed" mode="" />
  <book name="second" feed="communityfeed" mode="modes" />
  <book name="second" feed="articlefeed" mode="modes" /> 
</Books>

我与XML::Simple一起使用PERL5.8版本。下面是我写的代码

代码语言:javascript
复制
    use XML::Simple;

    my $xs = new XML::Simple( KeyAttr => { book => 'name' } , ForceArray => [ 'book','name' ] );
    my $config = $xs->XMLin( <complete path to xml file> );

下面是结果(使用Data::Dumper显示)

代码语言:javascript
复制
'book' => {
    'first' => {
        'feed'   => 'communityfeed',
        'mode'   => 'modes',
        'region' => '1'
    },
    'second' => {
        'feed' => 'articlefeed',
        'mode' => 'modes'
    },
}

相反,我希望输出的格式如下

代码语言:javascript
复制
'book' => {
    'first' => {
        'communityfeed' => { mode => 'modes', region => '1' },
        'contentfeed'   => { mode => 'modes' }
    },
    'second' => {
        'communityfeed' => { mode => 'modes' },
        'contentfeed'   => { mode => '' },
        'articlefeed'   => { mode => 'modes' }
    },
}

备注

  1. 不能更改XML文件格式,因为它是当前的生产版本。
  2. 首选Perl版本5.8,因为这是父脚本中使用的版本,解析逻辑应该合并到该脚本中

你以前遇到过这样的问题吗?如果是的话,又如何处理呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-06 23:02:54

XML::Simple是一个令人尴尬和令人沮丧的模块,我非常怀疑您能否说服它构建您所需的数据结构。几乎任何其他XML解析器都将向前迈进一步。

这里有一个使用XML::Twig的解决方案。您可以查询已解析的XML数据,并从中构建任何您喜欢的数据结构。

我只使用Data::Dump来显示结果数据

代码语言:javascript
复制
use strict;
use warnings 'all';

use XML::Twig;

my $config;

{
    my $twig = XML::Twig->new;
    $twig->parsefile('books.xml');

    for my $book ( $twig->findnodes('/Books/book') ) {

        my $atts = $book->atts;
        my ( $name, $feed ) = delete @{$atts}{qw/ name feed /};

        $config->{book}{$name}{$feed} = $atts;
    }
}

use Data::Dump;
dd $config;

输出

代码语言:javascript
复制
{
  book => {
    first  => {
                communityfeed => { mode => "modes", region => 1 },
                contentfeed   => { mode => "modes" },
              },
    second => {
                articlefeed   => { mode => "modes" },
                communityfeed => { mode => "modes" },
                contentfeed   => { mode => "" },
              },
  },
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37667825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档