아래와 같이 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
다음을 시도했습니다.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'
그러나 이것은 작동하지 않습니다. 내 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()"