Como faço para usar XML :: LibXML para XML de análise usando SAX?
-
19-09-2019 - |
Pergunta
O único exemplo de código que eu encontrei até agora é tão antiga que não funciona mais (usos obsoleto classes). Todos necessidade I é algo básico que demonstra:
-
Carregamento e analisar o XML de um arquivo
-
A definição do manipulador de eventos SAX (s)
-
A leitura dos atributos ou valores de texto do elemento passado para o manipulador de eventos
Solução
Como sobre a própria distribuição ?
Vá para XML :: LibXML página de distribuição e clique browse .
Observe o seguinte cautela na documentação :
No XML momento :: LibXML fornece apenas uma interface incompleta para a implementação SAX nativo do libxml2. A implementação atual não é testado em ambiente de produção. Pode causar problemas de memória significativos ou programas de comportamento errado.
Há também XML :: SAX que vem com agradável documentação . Eu usei-o algumas vezes e funcionou bem para os meus propósitos.
Outras dicas
A sugestão de Sinan era bom, mas não ligar todos os pontos. Aqui está uma forma muito simples programa que eu remendada:
arquivo 1: Os manipuladores (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;
arquivo 2: O programa de teste (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: Como obter os valores de um atributo do elemento. Este não foi descrito de uma maneira que eu poderia usar. Levei mais de uma hora para descobrir a sintaxe. Aqui está. No meu arquivo XML, o atributo foi ss: Index. A definição namespace para ss foi xmlns: ss = "urn: schemas-microsoft-com: office: spreadsheet". Assim, a fim de obter o atributo Índice bobo, eu precisava disso:
my $ssIndex = $el->{Attributes}{'{urn:schemas-microsoft-com:office:spreadsheet}Index'}{Value};
Isso foi doloroso.
XML :: LibXML :: Sax implementos a interface e Perl SAX existe um documento legal.