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

3

到目前为止,我找到的唯一示例代码都已过时无法使用(使用了已弃用的类)。我只需要一个简单的东西来演示:

  1. 从文件中加载和解析XML

  2. 定义SAX事件处理程序

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

3个回答

7

谢谢。我以前从没注意到浏览链接。不过,我确实看到了你提到的警告。你会推荐使用其他的Perl SAX解析器吗?我不挑剔。虽然这不是用于大文件,但我更喜欢事件驱动的方法来解决这个问题,因为我正在读取Excel输出的稀疏数据。 - Paul Chernoch
XML::SAX 的文档看起来很易懂,你得到了我的支持。 - Paul Chernoch

6

Sinan的建议很好,但它没有连接所有的点。这里是一个我拼凑出来的非常简单的程序:

文件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。命名空间定义为xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"。因此,为了获取这个奇怪的Index属性,我需要使用以下代码:

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

那真是令人痛苦。


0

XML::LibXML::Sax 实现了 Perl SAX 接口,并且有一个很好的文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接