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