代码之家  ›  专栏  ›  技术社区  ›  Paul Chernoch

如何使用XML::libxml来使用SAX解析XML?

  •  3
  • Paul Chernoch  · 技术社区  · 15 年前

    到目前为止,我发现的唯一一个示例代码太旧了,它将不再工作(使用不推荐使用的类)。我只需要一些基本的东西来证明:

    1. 从文件加载和分析XML

    2. 定义SAX事件处理程序

    3. 读取传递给事件处理程序的元素的属性或文本值

    3 回复  |  直到 11 年前
        1
  •  7
  •   Sinan Ünür    15 年前

    How about the distribution itself ?

    XML::LibXML distribution page 然后点击 browse .

    注意以下注意事项 documentation :

    目前,xml::libxml只提供到libxml2的本机SAX实现的不完整接口。当前的实现没有在生产环境中进行测试。它可能导致严重的记忆问题或表现出错误的行为。

    也有 XML::SAX 随附的 nice documentation . 我用了几次,为我的目的工作得很好。

        2
  •  6
  •   Paul Chernoch    15 年前

    西南的建议很好,但并没有把所有的点都联系起来。下面是我拼凑起来的一个非常简单的程序:

    文件1:处理程序(mysaxhandler.pm)

      package MySAXHandler;
      use base qw(XML::SAX::Base);
    
      sub start_document {
        my ($self, $doc) = @_;
        # process document start event
      }
    
      sub start_element {
        my ($self, $el) = @_;
        # process element start event
        print "Element: " . $el->{LocalName} . "\n";
      }
    
    1;
    

    文件2:测试程序(test.pl)

    #!/usr/bin/perl
    
    use strict;
    use XML::SAX;
    use MySAXHandler;
    
    my $parser = XML::SAX::ParserFactory->parser(
            Handler => MySAXHandler->new
    );
    
    $parser->parse_uri("some-xml-file.xml");
    

    注意:如何获取元素属性的值。这并不是以我可以使用的方式描述的。我花了一个多小时才搞清楚语法。在这里。在我的XML文件中,属性是ss:index。ss的命名空间定义是xmlns:ss=“urn:schemas-microsoft-com:office:spreadsheet”。因此,为了获得愚蠢的索引属性,我需要这样做:

    my $ssIndex = $el->{Attributes}{'{urn:schemas-microsoft-com:office:spreadsheet}Index'}{Value};
    

    那太痛苦了。

        3
  •  0
  •   9re    11 年前

    xml::libxml::sax实现 the Perl SAX interface 还有一份很好的文件。