Получить значение узла из 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" , но это дает пустое эхо. Это из-за проблемы пространства имен?

  • Как получить список значений соответствия атрибутов с помощью xmllint и xpath?
  • Как я могу избежать специальных символов в команде sed?
  • xmllint отображает значение второго атрибута, если первый соответствует
  • Получить значение атрибута из xml с пространствами имен с помощью xmllint
  • Есть ли какие-либо инструменты, которые позволят мне проверить длину строки XML-узла
  • Название атрибута strip из набора результатов?
  • Значения отображения xmllint более 1 атрибута в одном исполнении
  • Как подсчитать узлы и получить значение атрибута без использования xpath
  • 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()" внутри кавычек без котировки, и вместо использования вы используете оператор ==.

    Interesting Posts

    Как импортировать CSV-файл в PostgreSQL на основе условия

    Динамики не отключаются после отключения звука

    не может убить процесс gedit из своего PID

    Какие части исполняемого файла ELF загружаются в память и где?

    Как увеличить масштаб отображения на дисплее?

    i3 Менеджер Windows – назначение окна в рабочее пространство

    Что делает «set -» в этой точке входа в Dockerfile?

    Как настроить или перепрограммировать функцию определенных клавиш на моей клавиатуре и светодиод на моем ноутбуке

    Избежание проблем с разрешениями на переносном жестком диске в Linux Mint

    grub ждет ввода пользователем при загрузке в качестве гостевого в виртуальном боксе

    Найти строку между пробелами

    Swap CapsLock и управление с помощью xmodmap (решение для справочной страницы не работает)

    Задача Cron для выполнения файлов jar файлов по рабочим дням по местному времени с 8 до 17 часов, без выходных

    использование cat во входном файле

    Как создать случайные шестнадцатеричные цифры без пробелов?

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