Xmllint

使用 xmllint 從 XML 中獲取節點值

  • September 29, 2016

我有一個名為 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')", then echo "$statusMSG",但這給出了一個空的迴聲。這是因為命名空間問題嗎?

如果你Det.xml總是看起來像那樣(例如不會有任何額外的ResponseType節點),你可以簡單地使用這個:

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

它會吐出:success


如果您的 xmllint 由於某種原因沒有 xpath,您可以隨時使用正則表達式來處理這類事情:

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

它使用 Perl 正則表達式來允許向前看/向後看,並且只顯示匹配的部分(而不是整行)。這將在完全不使用 xmllint / xpath 的情況下輸出與上面相同的內容。

引用自:https://unix.stackexchange.com/questions/92158