如何解析XML并在Perl中创建树结构

时间:2013-05-25 04:30:26

标签: perl cpan

我正在使用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'
};

我知道使用相同键的哈希是不可能的。请建议一种方法,我可以保持标签序列,并能够打印它们。

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分: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 );

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