xmllint를 사용하여 XML에서 노드 값 가져오기

xmllint를 사용하여 XML에서 노드 값 가져오기

아래와 같이 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유닉스 환경에도 존재하지 않습니다. 내가 여기서 뭘 잘못하고 있는지 말해 줄 수 있는 사람이 있나요?

statusMSG=="$(echo "cat /Envelope/Body/grtHgetRed/ResponseType/text()" | xmllint --nocdata --shell response.xml | sed '1d;$d')"나는 또한 , then 을 사용해 보았지만 echo "$statusMSG"이로 인해 빈 에코가 발생했습니다. 네임스페이스 문제 때문인가요?

답변1

귀하의 노드가 항상 이와 같은 경우 Det.xml(예: 추가 노드가 없는 경우 ResponseType) 간단히 다음을 사용할 수 있습니다.

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

그것은 뱉어질 것이다:success


어떤 이유로 xmllint에 xpath가 없으면 언제든지 정규식을 사용하여 이런 종류의 작업을 처리할 수 있습니다.

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

Perl 정규식을 사용하여 정방향/역방향을 허용하고 전체 줄 대신 일치하는 부분만 표시합니다. 그러면 xmllint/xpath를 전혀 사용하지 않고도 위와 동일한 결과가 출력됩니다.

답변2

xmllint옵션을 사용하지 않고 --xmlpath솔루션을 찾을 때 다음이 도움이 되었습니다.

echo "cat //ResponseType/text()" | xmllint --nocdata --shell /tmp/Det.xml | grep -v '/'
success

따옴표 없이 내부 따옴표를 사용하고 할당 대신 == 연산자를 사용했기 때문에 예제가 statusMSG=="$(echo "cat /Envelope/Body/grtHgetRed/ResponseType/text()" | xmllint --nocdata --shell response.xml | sed '1d;$d')"작동하지 않습니다 .echo "cat .../text()"

관련 정보