【问题标题】:How to parse XML and create a tree structure in Perl如何在 Perl 中解析 XML 并创建树形结构
【发布时间】:2017-09-03 05:24:06
【问题描述】:

我正在使用XML::Simple 解析一个 XML 文件。有没有办法从 XML 中获取树形?如果是这样,请举例说明或建议一个 CPAN 包。

我想知道在column等之后我必须处理哪个标签。

标签没有顺序。 column 标签可以多次出现在Tabledisplay_name 之后。

Tab
    column
    Table
        column
    display_name
    column
    display_name

XML:

<Tab>
    <column>
        <display_name>xyz</display_name>
        <display_name>pqr</display_name>
    </column>
    <Table>
        <column><display_name>Department</display_name></column>
    </Table>
    <display_name>abc</display_name>
    <column>pwd</column>
    <display_name>jack</display_name>
</Tab>

使用 XML::Simple 输出:

$VAR1 = {
  'Table' => {
    'column' => {
      'display_name' => 'Department'
    }
  },
  'display_name' => [
    'abc',
    'jack'
  ],
  'column' => [
    {
      'display_name' => [
        'xyz',
        'pqr'
      ]
    },
    'pwd'
  ]
};

预期 o/p:

$VAR1 = {
  'column' => {
    'display_name' => [
      'xyz',
      'pqr'
    ]
  }
  'Table' => {
    'column' => {
      'display_name' => 'Department'
    }
  }, 
  'display_name' => 'abc',
  'column' => 'pwd',
  'display_name' =>'jack'
};

我知道具有相同键的哈希是不可能的。请提出一种我可以保持标签顺序并能够打印它们的方法。

【问题讨论】:

  • 为什么要重新发明轮子?你有理由不使用Dumper吗?
  • @Steve: 不能使用 dumper,因为从上面的 xml 打印 html 代码需要遍历。
  • @Ganesh 您永远不会在 Perl 中获得预期的输出。您有一个密钥冲突,因为您有两次 display_namecolumn 作为密钥。 XML::Simple 给你的是正确的。
  • 您的问题不清楚。请显示完整的输入 XML 和您想要的输出。

标签: perl cpan


【解决方案1】:

XML::LibXML 创建一个不丢失信息的树。

use XML::LibXML qw( );
my $parser = XML::LibXML->new();
my $tree = $parser->parse_file($qfn);

您可以从那里生成您指定的输出。 (我不知道你为什么要这样做,因为你想要输出的 Perl 代码如果运行会丢失数据。)

【讨论】:

  • 您好,感谢您的回复,请您提供以上使用 XML::LibXML 的输入文件的详细示例。 $qfn 是什么?
  • XML 文件的限定文件名,即 XML 文件的绝对路径,或 XML 文件相对于当前工作目录的路径。
【解决方案2】:

我用XML::Parser 处理同一个文件

#!/usr/sbin/perl
use  XML::Parser;
use Data::Dumper;
use strict;

my $Filename = "abc.xml";

my $Parser = new XML::Parser( Style => 'tree' );

my $Tree = $Parser->parsefile( $Filename );

print Dumper( $Tree );

如果有其他方法可以获得所需的输出,请提出建议。

【讨论】:

    猜你喜欢
    • 2014-04-23
    • 2011-02-24
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 2011-11-27
    相关资源
    最近更新 更多