【问题标题】:Does XML::Simple maintain order when using arrays?使用数组时 XML::Simple 是否保持顺序?
【发布时间】:2011-04-20 21:56:52
【问题描述】:

我正在使用 XML::Simple 来解析一个 XML 文件,然后我想用它来编写一个非常特定格式的输出文件。因此,输出顺序很重要。
据我了解,当 XML 转换为 perl hashref 时,顺序会丢失(因为 perl 哈希没有顺序)。但是当 XML::Simple 使用数组时呢?

例如:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
  <cd>
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <price>10.0</price>
  </cd>
  <cd>
    <title>Greatest Hits</title>
    <artist>Dolly Parton</artist>
    <price>9.99</price>
  </cd>
  <cd>
    <title>Hello</title>
    <artist>Say Hello</artist>
    <price>0001</price>
  </cd>
</catalog>

给了我们一个类似的数据结构:

$VAR1 = {
      'cd' => [
              {
                'artist' => 'Bonnie Tyler',
                'price' => '10.0',
                'title' => 'Hide your heart'
              },
              {
                'artist' => 'Dolly Parton',
                'price' => '9.99',
                'title' => 'Greatest Hits'
              },
              {
                'artist' => 'Say Hello',
                'price' => '0001',
                'title' => 'Hello'
              }
            ]
    };

这 3 个“cd”结构被插入到一个数组中,那么它们的顺序是否总是与它们在输入文件中的顺序相同?

【问题讨论】:

  • 你尝试的时候发生了什么?
  • 每次我都尝试过,但我需要知道这是否有保证。

标签: xml perl xml-simple


【解决方案1】:

在输入时,是的。使用数组将使它们保持有序。在许多情况下,我还没有找到使用 XML::Simple 保持输出有序的方法。

【讨论】:

  • 我不关心其他标签,只要数组保持它的顺序。
【解决方案2】:

保证有序,从某种意义上说,它没有记录在 POD 的任何地方或我所见过的 XML::Simple 的常见问题解答中。

但是,由于重新排列数组的顺序总是比保持数组的顺序更费力 - 对开发人员和计算机来说都是如此 - 您可以合理地假设更改顺序的可能性很小。

唯一确定的方法是:

  1. 查看 XML::Simple 的源代码并确保它以这种方式工作。就“XMLin”=> 数据结构顺序维护而言,这可能有点棘手,因为这可能取决于 XML::Simple 在下面使用哪个解析器(这是可配置的);我对 XML::Simple 代码知之甚少,无法确保数组填充是独立于解析器的。

    但是按照我上面的逻辑,重新排列顺序比不重新排列更难。

  2. 说服维护者将其设为通过 POD 签约的已声明功能,并添加单元测试以确保这一点。

【讨论】:

  • 保证可能是一个强词;我认为不太可能是相当不错的。正如您所说,没有理由投入额外的工作来重新排列数组。我会看一下源代码,看看是否有任何明显的东西跳出来。
  • perl-doc 声明“服务器 'kalahari' 上的第二个地址可以引用为:$config->{server}->{kalahari}->{address}->[1] ;"。这可能无法得到严格保证,但如果文档建议这是引用对我来说足够好的特定数组元素的方式......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多