【问题标题】:Working with XML::Parser, what datastructure does it return?使用 XML::Parser,它返回什么数据结构?
【发布时间】:2014-09-24 21:55:06
【问题描述】:

我正在尝试在 perl 中解析一些 XML,但我很难弄清楚如何访问它。我仅限于使用XML::ParserXML::Twig,因为它必须部署在大量RedHat 6 系统上而不添加任何模块,所以我不能使用像XML::Simple 这样更方便的东西。

问题是我如何获取数据。代码的核心是这样的:

use XML::Parser;
use Data::Dumper;

# $response_string is a string of XML.
my $xml_parser = new XML::Parser(Style => 'Time');
my $xml_wodge = $xml_parser->parse($response_string);

# Export methods to see what this is.
print Dumper ($xml_wodge);
print "I have a ref type: ", ref($xml_wodge), "\n";
print "I have array size: ", @xml_wodge, "\n";
print "I have hash keys:  ", %xml_wodge, "\n";
print "I have string value: ", $xml_wodge, "\n";

这会产生一些奇怪的输出(已编辑)

$VAR1 = [
   [valid XML dump]
];
I have reference type ARRAY
I have array size: 
I have hash keys:
I have string value ARRAY(0x22c5538)

$xml_wodge 中的值是某种东西。转储程序正确地将其转储出去,但我使用的所有数据结构原语似乎都没有返回任何内容。它检测为 Array,但它似乎是一个零元素数组,其中隐藏着完整的 XML 数据结构。

我如何到达它?

【问题讨论】:

  • 好像是数组引用。见References tutorial
  • 始终使用use strict; use warnings;$xml_wodge@xml_wodge 是不同的变量。
  • XML::Simple 本身的module documentation 不鼓励使用,因此我反对将其归类为“方便”。在这两个选项中,我建议使用XML::Twig,尽管它取决于版本号。
  • 您一直在说您无法安装模块,但您的代码依赖于 XML::Parser::Style::Time,这在 CPAN 上甚至都不存在。
  • XML::Parser 和 XML::Twig 都不是核心模块(包含在 Perl 中)。如果您从操作系统包存储库中获取它们,那么我建议您从同一个地方获取 XML::LibXML 和 using that

标签: perl xml-parsing


【解决方案1】:

您使用 XML::Parse 错误。阅读the documentation

具体来说,->parse() 方法并不意味着返回任何东西。它旨在用数据填充 XML::Parse 对象。然后你就可以使用那个对象了。

所以,你会这样做:

my $xml_parser = new XML::Parser(Style => 'Time');
$xml_parser->parse($response_string);

# .. Then use $xml_parser

【讨论】:

  • 我无法协调“不意味着返回任何东西”与“树”样式的文档,“解析将为文档返回解析树”。我肯定得到了一个对象的引用,它确实有某种数据结构,里面有我的 XML。
  • @sysadmin1138:它可能会返回对象本身,就像许多对象类一样。但是,如果您查看文档页面顶部的示例,它显然不期望返回值,并且parse 文档没有说明返回值。
【解决方案2】:

choroba 在 cmets 中是正确的,此调用返回一个数组引用。根据 perlreftut,访问数组需要:

${$xml_wodge}[0]

样式语法。

XML::Parser 返回一个特别格式化的数据结构。对于这样的 XML 结构:

<Top>
  <Mid1 id="thing">
    <Leaf1>"I'm a leaf"</Leaf1>
  </Mid1>
</Top>
  • 数组索引 0 将是字符串“Top”
  • 数组索引 1 将是另一个数组引用。
    • [1][0] 是一个哈希引用,只有一个键:'id',值为 'thing'。
    • [1][1] 是字符串“Mid1”。
    • [1][2] 是另一个数组引用。

奇数索引是节名,偶数索引是对其他元素的数组引用。

以 Leaf1 为例:

  • 数组索引 0 是对空哈希的哈希引用。
  • 数组索引 1 是字符串“Leaf1”。
  • 数组索引 2 是数组引用。
    • [..][2][0] 是对空哈希的哈希引用。
    • [..][2][1] 是值“0”,因为该元素没有名称。
    • [..][2][2] 是字符串“我是一片叶子”。

Leaf1的值可以直接通过:

${${${$xml_wodge}[1]}[2]}[2]}[2]

【讨论】:

  • 注意:${$xml_wodge}[1] 也可以写成:$xml_wodge-&gt;[1] 并且生成的$xml_wodge-&gt;[1]-&gt;[2]-&gt;[2]-&gt;[2] 可以进一步简化为:$xml_wodge-&gt;[1][2][2][2](虽然我不会)。
猜你喜欢
  • 2014-02-08
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多