以下のように、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
次のことを試しました。success
xmllint
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'
しかし、これはうまくいきません。私のxpath
Unix環境にも存在しません。私がここで何を間違っているのか教えてくれる人はいますか?
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()"