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シェルスクリプトを使用してそこから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'

しかし、それは機能していません。xpathまた、私のUNIX環境にはありません。ここで何が間違っているのか教えてもらえますか?

4

3 に答える 3

3

はコロンのlocal-name()直後にあるので、eg の代わりにlocal-name()='S:Envelope'ただ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 構文です。

この関数は要素の内容を返します。つまり、 ettext()を使用して結果をさらに処理する必要はありません。sedアル。

これは、オプションが利用できxmllintないSolarisとLinuxの両方のボックスで機能しました。--xpath

于 2013-11-06T00:26:35.080 に答える
0

あなたが何を間違っているのかわかりません... XMLlintの使用が必須ではない場合、JDomを使用できます。あなたのような要件の魅力のように機能します...ただの提案...

于 2013-09-24T12:56:55.840 に答える