Come si usa XML :: LibXML per analizzare XML utilizzando SAX?
-
19-09-2019 - |
Domanda
Il codice di esempio solo che ho trovato finora è così vecchio che non funziona più (utilizza le classi deprecato). Tutto quello che serve è una cosa fondamentale che dimostra:
-
Caricamento e parsing XML da un file
-
Definire il gestore di eventi SAX (s)
-
Leggere gli attributi o valori di testo dell'elemento passato al gestore di eventi
Soluzione
Come circa la distribuzione stessa ?
XML :: LibXML pagina di distribuzione e fare clic su sfogliare .
Si noti la seguente avvertenza nella :
Al momento XML :: LibXML solo fornisce un'interfaccia incompleta implementazione SAX nativa di libxml2. L'implementazione corrente non viene testato in ambiente di produzione. Può provoca problemi di memoria significativi o mostra un comportamento sbagliato.
C'è anche XML :: SAX che viene fornito con bella documentazione . Ho usato un paio di volte e ho lavorato bene per i miei scopi.
Altri suggerimenti
Il suggerimento di Sinan era buona, ma non collegare tutti i puntini. Ecco un programma molto semplice che ho messo insieme:
file 1: I gestori (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;
file 2: Il programma di test (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");
Nota: Come ottenere i valori di un attributo elemento. Questo non è stato descritto in un modo che ho potuto utilizzare. Mi ci sono voluti più di un'ora per capire la sintassi. Ecco qui. Nel mio file XML, l'attributo era ss: Index. La definizione dello spazio dei nomi per la ss era xmlns: ss = "urn: schemas-microsoft-com: office: foglio di calcolo". Pertanto, al fine di ottenere l'attributo Index sciocca, avevo bisogno di questo:
my $ssIndex = $el->{Attributes}{'{urn:schemas-microsoft-com:office:spreadsheet}Index'}{Value};
E 'stato doloroso.
XML :: :: LibXML Sax implementa Perl SAX interfaccia e non v'è un bel documento.