【问题标题】:Perl XML ParsingPerl XML 解析
【发布时间】:2011-03-25 02:59:07
【问题描述】:

我正在使用 XML::Simple 来解析 XML 文件。输出是一个哈希。(使用 Data::Dumper)

下面给出了示例代码,XML 文件和输出。

Perl 代码:

use XML::Simple;
use Data::Dumper;

$xml = new XML::Simple;

$data = $xml->XMLin("spam.xml");

print Dumper($data);

XML 文件内容(输入到解析器)::

<Attach_request>
    <Protocol_discriminator>
        <name> Protocol_discriminator </name>
        <attribute> Mandatory </attribute>
        <type> nibble </type>
        <value> 7 </value>
        <min> 0 </min>
        <max> F </max>
    </Protocol_discriminator>
    <Security_header>
        <name> Security_header </name>
        <attribute> Mandatory </attribute>
        <type> nibble </type>
        <value> 7 </value>
        <min> 0 </min>
        <max> F </max>
    </Security_header>
    <Security_header1>
        <name> Security_header </name>
        <attribute> Mandatory </attribute>
        <type> nibble </type>
        <value> 7 </value>
        <min> 0 </min>
        <max> F </max>
    </Security_header1>
    <Security_header2>
        <name> Security_header </name>
        <attribute> Mandatory </attribute>
        <type> nibble </type>
        <value> 7 </value>
        <min> 0 </min>
        <max> F </max>
    </Security_header2>
    <Security_header3>
        <name> Security_header </name>
        <attribute> Mandatory </attribute>
        <type> nibble </type>
        <value> 7 </value>
        <min> 0 </min>
        <max> F </max>
    </Security_header3>
</Attach_request>

输出::

$VAR1 = {
          'Security_header3' => {
                                'attribute' => ' Mandatory ',
                                'min' => ' 0 ',
                                'value' => ' 7 ',
                                'max' => ' F ',
                                'name' => ' Security_header ',
                                'type' => ' nibble '
                              },
          'Protocol_discriminator' => {
                                      'attribute' => ' Mandatory ',
                                      'min' => ' 0 ',
                                      'value' => ' 7 ',
                                      'max' => ' F ',
                                      'name' => ' Protocol_discriminator ',
                                      'type' => ' nibble '
                                    },
          'Security_header2' => {
                                'attribute' => ' Mandatory ',
                                'min' => ' 0 ',
                                'value' => ' 7 ',
                                'max' => ' F ',
                                'name' => ' Security_header ',
                                'type' => ' nibble '
                              },
          'Security_header' => {
                               'attribute' => ' Mandatory ',
                               'min' => ' 0 ',
                               'value' => ' 7 ',
                               'max' => ' F ',
                               'name' => ' Security_header ',
                               'type' => ' nibble '
                             },
          'Security_header1' => {
                                'attribute' => ' Mandatory ',
                                'min' => ' 0 ',
                                'value' => ' 7 ',
                                'max' => ' F ',
                                'name' => ' Security_header ',
                                'type' => ' nibble '
                              }
        };

我的另一个问题是:

  1. 有什么方法可以维持输出的顺序,就像我在输入 XML 文件中给出的一样??

【问题讨论】:

    标签: xml perl


    【解决方案1】:

    如果您看到XML::Simple 的文档,则说明

    XML::Simple 能够呈现一个简单的 API,因为它代表您做出了一些假设。其中包括:

    1. 您对仅包含空格的文本内容不感兴趣

    2. 你不介意当事情被吞入散列时,顺序就会丢失

    3. 您不希望对生成的 XML 的格式进行细粒度控制

    4. 您永远不会使用不是合法 XML 元素名称的哈希键

    5. 在不同编码之间转换不需要帮助。

    对于基于树的解析,您可以在 XML::Twig 的 'Perlish' 方法和更多基于标准的 DOM 实现 之间进行选择 - 最好是支持 XPath 的一种。

    有关更多详细信息,另请参阅“Perl-XML FAQ”。

    【讨论】:

      【解决方案2】:
      如果您关闭 KeyAttr 选项,

      一些会保留。如果您决定坚持使用 XML::Simple 并使用不同的设置,那么您真的应该快速阅读这篇文章:

      更好的方法是按照本文的建议完全放弃 XML::Simple:

      编辑(9 年后):我随后创建了一个名为 Perl XML::LibXML by Example 的教程站点,该站点使用大量示例介绍了 XML::LibXML 库和 XPath。 XML::LibXML 是一个比 XML::Simple 更好的处理 XML 的模块,并且由于 XPath 的强大功能,使用它通常更简单。

      【讨论】:

        【解决方案3】:

        我怀疑 XML::Simple 是否可行(也许您必须以某种方式对哈希键进行排序)。您还可以使用 XML::DOM 并通过子节点进行枚举。

        【讨论】:

          【解决方案4】:

          只需使用XML::LibXML

          【讨论】:

            猜你喜欢
            • 2011-08-08
            • 1970-01-01
            • 2013-11-15
            • 1970-01-01
            • 2013-07-24
            • 1970-01-01
            • 1970-01-01
            • 2012-09-10
            • 1970-01-01
            相关资源
            最近更新 更多