如何使用XML :: LibXML使用SAX解析XML?

时间:2009-08-25 19:15:38

标签: xml perl sax xml-libxml

到目前为止,我发现的唯一示例代码已经很久了,它将不再起作用(使用已弃用的类)。我所需要的只是一些基本的东西:

  1. 从文件加载和解析XML

  2. 定义SAX事件处理程序

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

3 个答案:

答案 0 :(得分:7)

How about the distribution itself

转到XML::LibXML distribution page,然后点击browse

请注意documentation中的以下注意事项:

  

目前,XML :: LibXML只为libxml2的本机SAX实现提供了一个不完整的接口。当前的实现未在生产环境中进行测试。它可能会导致严重的内存问题或显示错误的行为。

XML::SAX附带nice documentation。我曾经使用过几次并且很适合我的目的。

答案 1 :(得分:6)

思南的建议很好,但没有连接所有的点。这是一个非常简单的程序,我拼凑在一起:

文件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”。因此,为了得到愚蠢的Index属性,我需要这个:

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

那很痛苦。

答案 2 :(得分:0)

XML :: LibXML :: Sax实现the Perl SAX interface并且有一个很好的文档。