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

问题描述:

我迄今发现的唯一示例代码太旧了,不再适用了(使用了不推荐使用的类)。所有我需要的是一些基本的演示:如何使用XML :: LibXML来使用SAX解析XML?

  1. 加载和从文件

  2. 解析XML定义SAX事件处理程序(一个或多个)

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

How about the distribution itself

转至XML::LibXML distribution page并点击browse

注意在documentation下列注意事项:

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

还有XML::SAX其中nice documentation自带。我用了几次,为我的目的运作良好。

+0

谢谢。我从未注意过之前的浏览链接。但是,我确实看到了您引用的警告。你会推荐一个不同的Perl SAX解析器吗?我不挑剔。它不适用于大文件,但我更喜欢事件驱动的方法解决此问题,因为我正在读取Excel输出的稀疏数据。 – 2009-08-25 19:30:19

+0

XML :: SAX文档看起来清晰易懂。你得到我的投票。 – 2009-08-25 19:46:04

+0

@Paul谢谢。 – 2009-08-25 19:46:39

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

文件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}; 

这很痛苦。

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