gpt4 book ai didi

perl:如何按顺序解析 xml 文件

转载 作者:行者123 更新时间:2023-12-04 09:52:15 24 4
gpt4 key购买 nike

我有一个 XML 文件,它描述了我可以在 UDP channel 上交换的数据结构。
例如:
这是描述我的数据结构的输入 XML 文件。

<ds>
<uint32 name='a'/>
<uint32 name='b'/>
<string name='c'/>
<int16 name='d'/>
<uint32 name='e'/>
</ds>

使用 perl 的 XML:Simple 解析这个 XML 文件,允许我生成以下哈希
$VAR1 = {
'uint32' => {
'e' => {},
'a' => {},
'b' => {}
},
'int16' => {
'name' => 'd'
},
'string' => {
'name' => 'c'
}
};

如您所见,解析后我无法确定字段“e”相对于数据结构开头的相对位置。

我想找出每个元素的偏移量。

我尝试搜索允许我按顺序解析 XML 文件的 perl XML 解析器,类似于“getnexttag()”之类的功能,但找不到任何功能。

以编程方式执行此操作的最佳方法是什么?如果不是 perl,那么哪种其他语言最适合做这项工作?

最佳答案

您需要使用带有适当回调的流式解析器,这也将提高解析速度(如果操作正确,还可以减少内存消耗),这很好/真棒事物。
我推荐你使用XML::SAX ,该模块的介绍可在以下链接下找到:

  • XML::SAX::Intro

  • start_element 提供回调,这样您就可以一次读取每个元素的值。

    你能给我写一个简单的例子吗?
    是的,我已经有了! ;-)
    下面的代码片段将解析 OP 提供的数据并打印每个元素的名称,以及属性键/值。
    它应该很容易理解,但是如果您有任何问题,请随时将它们添加为评论,我将使用更详细的信息更新这篇文章。
    use warnings;
    use strict;

    use XML::SAX;

    my $parser = XML::SAX::ParserFactory->parser(
    Handler => ExampleHandler->new
    );

    $parser->parse_string (<<EOT
    <ds>
    <uint32 name='a'/>
    <uint32 name='b'/>
    <string name='c'/>
    <int16 name='d'/>
    <uint32 name='e'/>
    </ds>
    EOT
    );

    # # # # # # # # # # # # # # # # # # # # # # # #

    package ExampleHandler;

    use base ('XML::SAX::Base');

    sub start_element {
    my ($self, $el) = @_;

    print "found element: ", $el->{Name}, "\n";

    for my $attr (values %{$el->{Attributes}}) {
    print " '", $attr->{Name}, "' = '", $attr->{Value}, "'\n";
    }

    print "\n";
    }
    输出
    found element: ds

    found element: uint32
    'name' = 'a'

    found element: uint32
    'name' = 'b'

    found element: string
    'name' = 'c'

    found element: int16
    'name' = 'd'

    found element: uint32
    'name' = 'e'

    我对 XML::SAX 不满意,还有其他可用的模块吗?
    是的,有很多可供选择。阅读以下列表并选择适合您特定问题的列表:
  • perl-xml.sourceforge.net/faq - cpan modules

  • 不同的解析方法有什么区别?
    我还建议阅读以下有关 XML 解析的常见问题解答。它将提出使用树解析器(例如 XML::Parser::Simple)或流解析器的优点和缺点:
  • Perl-XML Frequently Asked Questions, Tree VS Stream
  • 关于perl:如何按顺序解析 xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8626435/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com