Получить узел для XML с пространством имен, используя XPath

#xml #xpath #automationanywhere

#xml #xpath #автоматизация везде

Вопрос:

Я пытаюсь выбрать узел на основе значения в элементе в файле xml, который содержит пространство имен.

Я использую команду Get XML Node от Automation Anywhere, которая ограничивает меня использованием однострочной инструкции XPath.

Это образец XML-файла

 <IMPORT xmlns="urn:Import">
    <STUFF>
        <STUFF_TYPE>
            <STUFF_TYPE_KEY>1</STUFF_TYPE_KEY>
        </STUFF_TYPE>
        <WALMART>
            <STORE>
                <STORE_ID TYPE="SC" ID="SC-12345">WM000001</STORE_ID>
                <STORE_STATUS>O</STORE_STATUS>
            </STORE>
        </WALMART> 
    </STUFF>
</IMPORT>
  

Я хотел бы выбрать значение STORE_STATUS, где STORE_ID = WM000001

Прямо сейчас он не находит узел.

Ответ №1:

Вы можете использовать независимое от пространства имен выражение, например

 //*[local-name() = 'STORE']/*[local-name() = 'STORE_ID' and text() = 'WM000001']/../*[local-name() = 'STORE_STATUS']
  

Это выбирает STORE_STATUS элемент из всех STORE элементов с STORE_ID дочерними элементами, которые имеют значение WM000001 . Если вам нужно только значение, добавьте /text() в конец выражения.

Комментарии:

1. Получаем следующую ошибку: ‘//*[namespace-uri()=’urn:Import’ и local-name() = ‘STORE’]/*[namespace-uri()=’urn:Import’ и local-name() = ‘STORE_ID’ и text()=’WM000001′]/DefaultNSPrefix:../*[namespace-uri()=’urn:Import’ и local-name() = ‘STORE_STATUS’ ]’ имеет недопустимое полное имя. Я предполагаю, что, поскольку .. используется для перехода на следующий уровень и выбора STORE_STATUS, он не привязан к пространству имен.

Ответ №2:

В итоге это сработало:

 //*[local-name() = 'STORE']/*[local-name() = 'STORE_ID' and text() = 'WM000001']/following-sibling::*[local-name() = 'STORE_STATUS']