Как использовать XML :: LibXML для анализа XML с использованием SAX? - PullRequest
3 голосов
/ 25 августа 2009

Единственный пример кода, который я нашел до сих пор, настолько старый, что он больше не будет работать (использует устаревшие классы). Все, что мне нужно, это что-то простое, что демонстрирует:

  1. Загрузка и анализ XML из файла

  2. Определение обработчиков событий SAX

  3. Чтение атрибутов или текстовых значений элемента, переданного в обработчик события

Ответы [ 3 ]

7 голосов
/ 25 августа 2009

Как насчет самого дистрибутива ?

Перейдите на страницу XML :: LibXML и нажмите browse .

Обратите внимание на следующее предостережение в документации :

На данный момент XML :: LibXML предоставляет только неполный интерфейс для реализации SAX в libxml2. Текущая реализация не тестируется в производственной среде. Это может привести к серьезным проблемам с памятью или неправильному поведению.

Существует также XML :: SAX , который поставляется с хорошей документацией . Я использовал его несколько раз и хорошо работал для моих целей.

6 голосов
/ 26 августа 2009

Предложение Синан было хорошим, но оно не связывало все точки. Вот очень простая программа, которую я собрал вместе:

файл 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: могущество". Таким образом, чтобы получить глупый атрибут Index, мне понадобилось:

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

Это было больно.

0 голосов
/ 18 ноября 2013

XML :: LibXML :: Sax реализует интерфейс Perl SAX и есть хороший документ.

...