Ajuda a processar xml em ubuntu

reise

Power Member
Boas pessoal,
precisava de ajuda a tentar ler o valor de um atributo xml na linha de comando do linux.

Estou a tentar usar o xmlstarlet mas dá-me sempre erro
Código:
XPath error : Undefined namespace prefix
xmlXPathCompiledEval: evaluation failed
runtime error: element value-of
xsltValueOf: text copy failed
no result for users_ws2.xml
Não posso colocar o xml aqui porque é de uma empresa, por isso se me puderem dar dicas para eu experimentar agradecia. Obrigado.

Consegui fazer um xml que dá erro sem dados confidenciais!

Código:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<Exchange>7</Exchange>
<teste1>0</teste1>
</soap:Body>
</soap:Envelope>

$xmlstarlet sel -t -v "/soap:Envelope/soap:Body/teste1" users_ws2.xml
XPath error : Undefined namespace prefix
xmlXPathCompiledEval: evaluation failed
runtime error: element value-of
xsltValueOf: text copy failed
no result for users_ws2.xml
 
Última edição:
Se fosse com Perl (com o módulo XML::Twig), faria qualquer coisa do género:
Ficheiro: teste.xml
Código:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<Exchange>7</Exchange>
<teste1>0</teste1>
</soap:Body>
</soap:Envelope>

Exemplo 1 (extrair o Body):
Código:
$ xml_grep soap:Body teste.xml

<?xml version="1.0" ?>
<xml_grep version="0.7" date="Wed Oct 10 15:43:12 2007">
<file filename="teste.xml">
  <soap:Body>
    <Exchange>7</Exchange>
    <teste1>0</teste1>
  </soap:Body>
</file>
</xml_grep>

Exemplo 2 (apenas o elemento Exchange):
Código:
$ xml_grep Exchange teste.xml

<?xml version="1.0" ?>
<xml_grep version="0.7" date="Wed Oct 10 15:44:46 2007">
<file filename="teste.xml">
  <Exchange>7</Exchange>
</file>
</xml_grep>

O resultado é devolvido em XML, o que pode ser útil (ou não, isso já depende do que precisas).
 
Isso não dá para retornar só o valor do elemento sem ser em xml?
Bom, se souberes qual o elemento e a posição dele na tree, podes usar qualquer coisa assim:
Código:
$ perl -MXML::Simple -e '$xml = XMLin("teste.xml"); print $xml->{"soap:Body"}->{"Exchange"}'
7
Neste caso, usas o módulo XML::Simple.

Se quiseres ver a hash:
Código:
$ perl -MXML::Simple -MData::Dumper -e 'print Dumper(XMLin("teste.xml"));'

$VAR1 = {
          'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
          'soap:Body' => {
                         'Exchange' => '7',
                         'teste1' => '0'
                       },
          'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
          'xmlns:soap' => 'http://schemas.xmlsoap.org/soap/envelope/'
        };
 
Última edição:
Desisti de usar utilitários, fiz uma coisa em Java para fazer o que eu queria. Só ainda naõ consegui fazer o pedido soap directamente do Java. Fica para amanhã! :)
 
Penso que ficas bem servido com Java. Caso precises de fazer algo mais complexo, podes usar processadores de XML open source que implementem os standards XQuery e XPath.
 
Back
Topo