Как использовать XML::LibXML для анализа XML с помощью SAX?

StackOverflow https://stackoverflow.com/questions/1330373

  •  19-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Идти к Страница распространения XML::LibXML и нажмите просматривать.

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

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

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

Другие советы

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

файл 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};

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top