Получить значение узла из XML с помощью xmllint

У меня есть xml под названием Det.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> 

Я пытаюсь получить значение узла узла ResponseType от него, используя xmllint в сценарии оболочки Unix, и поэтому я попробовал следующее:

 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. Может ли кто-нибудь сказать мне, что я делаю неправильно здесь?

Я также попытался использовать statusMSG=="$(echo "cat /Envelope/Body/grtHgetRed/ResponseType/text()" | xmllint --nocdata --shell response.xml | sed '1d;$d')" , затем echo "$statusMSG" , но это дает пустое эхо. Это из-за проблемы пространства имен?

  • Как подсчитать узлы и получить значение атрибута без использования xpath
  • Как получить список значений соответствия атрибутов с помощью xmllint и xpath?
  • Есть ли какие-либо инструменты, которые позволят мне проверить длину строки XML-узла
  • Как отформатировать атрибуты xml, а не только элементы
  • Оболочка xmllint не показывает число из выражения count xpath?
  • Как написать содержимое запроса XMLLint --shell?
  • Проблема с кодировкой в ​​сценарии оболочки
  • Название атрибута strip из набора результатов?
  • 2 Solutions collect form web for “Получить значение узла из XML с помощью xmllint”

    Если ваш Det.xml всегда будет выглядеть так (например, у него не будет никаких дополнительных узлов ResponseType ), вы можете просто использовать это:

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

    И это выплюнет: success


    Если по какой-либо причине ваш xmllint не имеет xpath, вы всегда можете вернуться к регулярным выражениям для такого рода вещей:

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

    Он использует регулярные выражения Perl, чтобы обеспечить позитивный взгляд вперед / назад и отображать только согласованную часть (не всю строку). Это будет выводить то же, что и выше, без использования xmllint / xpath.

    Поскольку вы искали решение с помощью 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()" внутри кавычек без котировки, и вместо использования вы используете оператор ==.

    Linux и Unix - лучшая ОС в мире.