xmllintを使用してXMLからノード値を取得する

xmllintを使用してXMLからノード値を取得する

以下のように、Det.xmlというXMLがあります。

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

ノード値を取得するためにUnixシェルスクリプトでこれを使用しようとしているので、ResponseType次のことを試しました。successxmllint

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'

しかし、これはうまくいきません。私のxpathUnix環境にも存在しません。私がここで何を間違っているのか教えてくれる人はいますか?

statusMSG=="$(echo "cat /Envelope/Body/grtHgetRed/ResponseType/text()" | xmllint --nocdata --shell response.xml | sed '1d;$d')"私も、 then を使ってみましたが、echo "$statusMSG"これにより空のエコーが発生しました。名前空間の問題のためですか?

答え1

あなたのノードが常にこのような場合Det.xml(たとえば、追加のノードがない場合ResponseType)、単に次のものを使用できます。

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

それは吐き出すでしょう:success


何らかの理由でxmllintにxpathがない場合は、いつでも正規表現を使用してこの種の操作を処理できます。

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

Perl正規表現を使用して順方向/逆方向を許可し、行全体ではなく一致する部分のみを表示します。これにより、xmllint / xpathをまったく使用せずに上記と同じ結果が出力されます。

答え2

xmllintオプションを使用せずに--xmlpathソリューションを見つけると、次のことが役に立ちました。

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

引用符なしで内部引用符を使用し、代入の代わりに==演算子を使用したため、例はstatusMSG=="$(echo "cat /Envelope/Body/grtHgetRed/ResponseType/text()" | xmllint --nocdata --shell response.xml | sed '1d;$d')"機能しません。echo "cat .../text()"

関連情報