Recuperar el valor de atributo de xml con espacios de nombres utilizando xmllint

Quiero recuperar el valor del atributo, usando la opción xpath (sin usar el shell xmllint ').

mi 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> 

esto lo intenté:

 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 

(Sé que puedo usar sed para eliminar espacios de nombres pero también quiero evitar eso)

Related of "Recuperar el valor de atributo de xml con espacios de nombres utilizando xmllint"

Sí, no use sed en XML . Son malas noticias.

Creo que su problema es en realidad una simple cuestión de citar: cita su xpath en comillas simples, y Elem también está entre comillas simples.

No tengo una copy de xmllint mano, pero esto 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> 

Eso imprime:

 sn="101" 

Tampoco necesita el XML , porque // denota "cualquier parte del tree". Entonces podrías usar:

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

En aras de la integridad, al registrar el espacio de nombres, podrías hacerlo así:

 #!/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> 

Ahora, sé que esto no ayuda directamente con xmllint , además de permitir la testing del xpath que estás usando. Pero creo que es probable que sean citas que te hagan tropezar, no el xpath .

¿Puedo sugerir que necesita:

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