Xmllint
使用 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 shell 腳本從中獲取
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'
但它不起作用。我的 unix 環境中也沒有
xpath
。誰能告訴我我在這裡做錯了什麼?我也嘗試使用
statusMSG=="$(echo "cat /Envelope/Body/grtHgetRed/ResponseType/text()" | xmllint --nocdata --shell response.xml | sed '1d;$d')"
, thenecho "$statusMSG"
,但這給出了一個空的迴聲。這是因為命名空間問題嗎?
如果你
Det.xml
總是看起來像那樣(例如不會有任何額外的ResponseType
節點),你可以簡單地使用這個:xmllint --xpath 'string(//ResponseType)' Det.xml
它會吐出:
success
如果您的 xmllint 由於某種原因沒有 xpath,您可以隨時使用正則表達式來處理這類事情:
grep -Po '(?<=<ResponseType>)\w+(?=</ResponseType>)' Det.xml
它使用 Perl 正則表達式來允許向前看/向後看,並且只顯示匹配的部分(而不是整行)。這將在完全不使用 xmllint / xpath 的情況下輸出與上面相同的內容。