Recuperar valor de atributo de xml com namespaces usando xmllint

2

Eu quero recuperar o valor do atributo, usando a opção xpath (sem usar o shell xmllint).

meu xml:

<?xml version="1.0" encoding="UTF-8"?>
<XML>
    <hhi:Elem xmlns:hhi="http://www.w3.org/TR/html4/" version="1.0" sn="101"> 
    </hhi:Elem>
</XML>

isso que eu tentei:

xmllint --xpath '//XML/*[local-name()='Elem']/@sn' FILE_1.xml
XPath set is empty

xmllint --xpath '//XML/*[local-name()='Elem' and namespace-uri()="http://www.w3.org/TR/html4/"]/@sn' FILE_1.xml
XPath set is empty

(Eu sei que posso usar sed para remover namespaces, mas também quero evitar isso)

    
por markiz 29.12.2015 / 20:59

1 resposta

3

Sim, não use sed on XML . São más notícias.

Acho que o seu problema é, na verdade, uma simples questão de citar: você cita seu xpath entre aspas simples e Elem também está entre aspas simples.

Eu não tenho uma cópia do xmllint útil, mas isso funciona:

#!/usr/env/perl

use strict;
use warnings;

use XML::LibXML;

my $xml = XML::LibXML -> load_xml ( IO => \*DATA ); 
print $xml -> findnodes('//XML/*[local-name()="Elem"]');

__DATA__
<?xml version="1.0" encoding="UTF-8"?>
<XML>
    <hhi:Elem xmlns:hhi="http://www.w3.org/TR/html4/" version="1.0" sn="101"> 
    </hhi:Elem>
</XML>

Isso imprime:

sn="101"

Você também não precisa do XML , porque // indica "em qualquer lugar da árvore". Então você poderia usar:

//*[local-name()="Elem"]/@sn
/XML/*[local-name()="Elem"]/@sn

Por questões de integridade, ao registrar o namespace, você pode fazer assim:

#!/usr/env/perl

use strict;
use warnings;

use XML::LibXML;

my $xml = XML::LibXML -> load_xml ( IO => \*DATA ); 
my $xpc = XML::LibXML::XPathContext -> new;
$xpc -> registerNs('x', 'http://www.w3.org/TR/html4/');
print $xpc -> findnodes('/XML/x:Elem/@sn', $xml);

__DATA__
<?xml version="1.0" encoding="UTF-8"?>
<XML>
    <hhi:Elem xmlns:hhi="http://www.w3.org/TR/html4/" version="1.0" sn="101"> 
    </hhi:Elem>
</XML>

Agora, sei que isso não ajuda diretamente com xmllint , além de permitir o teste do xpath que você está usando. Mas eu acho que é provável que as cotações o atinjam, não o xpath .

Posso sugerir que você precisa:

xmllint --xpath '//*[local-name()="Elem"]/@sn' FILE_1.xml
    
por 03.01.2016 / 00:20

Tags