1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Ajuda a processar xml em ubuntu

Discussão em 'Dúvidas e Suporte Técnico - GNU/Linux & *nix' iniciada por reise, 9 de Outubro de 2007. (Respostas: 6; Visualizações: 1747)

  1. reise

    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: 10 de Outubro de 2007
  2. slack_guy

    slack_guy Power Member

    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).
     
  3. reise

    reise Power Member

    Isso não dá para retornar só o valor do elemento sem ser em xml?
     
  4. slack_guy

    slack_guy Power Member

    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: 10 de Outubro de 2007
  5. reise

    reise Power Member

    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ã! :)
     
  6. slack_guy

    slack_guy Power Member

    AH! O Perl é de facto um utilitário, mas, ao contrário do Java, é um utilitário 'útil' :-) ehehe

    Depois, hás-de mostrar com quantas linhas de código Java resolveste este problema :P
     
  7. AliFromCairo

    AliFromCairo Power Member

    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.
     

Partilhar esta Página