我有一个名为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
。任何人都能告诉我这里我做错了什么吗?
答案 0 :(得分:3)
local-name()
只是冒号之后的位,所以不是例如local-name()='S:Envelope'
只试用local-name()='Envelope'
。
/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='grtHgetRed']/*[local-name()='ResponseType']
或者你可能想要考虑一种替代工具,例如xmlstarlet,它可以更好地支持这种事情。
答案 1 :(得分:1)
如果XML中只有一个ResponseType元素,请使用以下内容简化:
echo 'cat //ResponseType/text()' | xmllint --shell det.xml
//
是XPath语法,用于“在文档中的任何位置查找此元素”。
text()
函数返回元素的内容,这意味着您不需要使用sed
等进一步按结果。人
对于我而言,xmllint
--xpath
没有{{1}}选项的Solaris和Linux盒子对我有用。
答案 2 :(得分:0)
我不知道你做错了什么...如果使用XMLlint不是强制性的,你可以使用JDom,就像你的需求一样有魅力...只是一个建议......