5

我有一个名为 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节点值,因此我尝试了以下操作:successxmllint

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。谁能告诉我我在这里做错了什么?

4

3 回答 3

3

Thelocal-name()只是冒号之后的那位,所以不要local-name()='S:Envelope'尝试 just local-name()='Envelope'

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

或者您可能想考虑一个替代工具,例如xmlstarlet ,它对这种事情有更好的支持。

于 2013-09-24T12:58:02.883 回答
1

如果 XML 中只有一个 ResponseType 元素,请使用以下内容来简化操作:

echo 'cat //ResponseType/text()' | xmllint --shell det.xml

用于“在文档中的任何位置查找此元素”的//XPath 语法。

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

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

于 2013-11-06T00:26:35.080 回答
0

我不知道你做错了什么......如果使用 XMLlint 不是强制性的,你可以使用 JDom,就像你这样的要求的魅力......只是一个建议......

于 2013-09-24T12:56:55.840 回答