Unix 使用xmllint从XML获取节点值

Unix 使用xmllint从XML获取节点值,unix,xmllint,Unix,Xmllint,我有一个名为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"

我有一个名为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环境中没有
xpath
。谁能告诉我我做错了什么吗?

我不知道你做错了什么。。。如果使用XMLlint不是强制性的,那么您可以使用JDom,它对您这样的需求非常有用。。。只是一个建议…

局部-name()只是冒号后的一位,因此,请尝试使用局部-name()='S:Envelope'而不是例如
local-name()='Envelope'

/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='grtHgetRed']/*[local-name()='ResponseType']

或者您可能想考虑一个替代工具,比如哪个更好地支持这类事情。

< P>如果XML中只有一个响应集元素,使用下面的方法来简化事情:

echo 'cat //ResponseType/text()' | xmllint --shell det.xml
/
是“在文档中的任何位置查找此元素”的XPath语法

text()
函数返回元素的内容,这意味着您不需要进一步使用
sed
等对结果进行按摩


这对我在Solaris和Linux上都有效,
xmllint
没有可用的
--xpath
选项。

我尝试了这个
statusMSG==”$(echo“cat/Envelope/Body/grtHgetRed/ResponseType/text()”| xmllint--nocdata shell response.xml | sed'1d;$d')”
然后当我执行
echo“$statusMSG”
时,我发现回音是空的。@DarkKnight
/Envelope/…
肯定不起作用,因为这将查找一个没有名称空间的元素,而您的XML在
http://schemas.xmlsoap.org/soap/envelope/
namespace。名称空间可能重复
echo 'cat //ResponseType/text()' | xmllint --shell det.xml