Obtenha o valor do Nó de um XML usando xmllint

2

Eu tenho um xml chamado Det.xml assim:

<?xml version="1.0" encoding="UTF-8"?>
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
        <S:Body>
            <ns4:grtHgetRed xmlns:ns2="http://object" xmlns:ns3="http://object" xmlns:ns4="http://object">
                <RequestId>lol</RequestId>
                <MessageDateTime>54.009</MessageDateTime>
                <SenderId>UH</SenderId>
                <ReceiverId>GER</ReceiverId>
                <TrackingNumber>45</TrackingNumber>
                <ServerName>trewds</ServerName>
                <ResponseType>success</ResponseType>
                <StatusInfo>
                <Status>success</Status>
                <SystemMessage>Hagert</SystemMessage>
                <UserMessage>Hgert</UserMessage>
                <Origination>htref</Origination>
                </StatusInfo>
            </ns4:grtHgetRed>
        </S:Body>
    </S:Envelope>

Estou tentando obter o ResponseType valor do nó success dele usando xmllint no script de shell do Unix e tentei o seguinte:

echo "cat //*[local-name()='S:Envelope'/*[local-name()='S:Body']/*[local-name()='ns4:grtHgetRed']/*[local-name()='ResponseType']" | xmllint --shell Det
.xml | sed '/^\/ >/d' | sed 's/<[^>]*.//g'

Mas não está funcionando. Também não tenho xpath no meu ambiente unix. Alguém pode me dizer o que estou fazendo de errado aqui?

Eu também tentei usar statusMSG=="$(echo "cat /Envelope/Body/grtHgetRed/ResponseType/text()" | xmllint --nocdata --shell response.xml | sed '1d;$d')" , depois echo "$statusMSG" , mas isso dá um eco vazio. Isso é por causa do problema de namespace?

    
por The Dark Knight 24.09.2013 / 15:03

2 respostas

9

Se o seu Det.xml for sempre assim (por exemplo, não haverá% nós%%), você pode simplesmente usar isso:

xmllint --xpath 'string(//ResponseType)' Det.xml

E vai cuspir: ResponseType

Se o seu xmllint não tiver o xpath por algum motivo, você sempre poderá usar expressões regulares para esse tipo de coisa:

grep -Po '(?<=<ResponseType>)\w+(?=</ResponseType>)' Det.xml

Ele usa expressões regulares Perl para permitir o olhar positivo à frente / olhar para trás e mostra apenas a parte correspondente (não a linha inteira). Isso produzirá o mesmo que acima sem usar xmllint / xpath.

    
por 24.09.2013 / 15:40
0

Como você estava procurando uma solução usando xmllint sem --xmlpath Option, o seguinte funciona para mim:

echo "cat //ResponseType/text()" | xmllint --nocdata --shell /tmp/Det.xml | grep -v '/'
success

Seu exemplo statusMSG=="$(echo "cat /Envelope/Body/grtHgetRed/ResponseType/text()" | xmllint --nocdata --shell response.xml | sed '1d;$d')" não funciona porque você usa o echo "cat .../text()" entre aspas sem cotação e usa o == Operador em vez de uma atribuição.

    
por 29.09.2016 / 09:40

Tags