Как искать элемент в полезной нагрузке XML, используя Xpath с Ballerina?

Пример: Как попасть в "город" с помощью балерины?

<h:People xmlns:h="http://www.test.com">
    <h:name>Anne</h:name>
    <h:address>
         <h:street>Main</h:street>
         <h:city>Miami</h:city>
    </h:address>
    <h:code>4</h:code>
</h:People>

Я пытался использовать функцию выбора, но она мне ничего не возвращает.

payload.select("city")

2 ответа

Решение

Мы можем использовать тот же метод selectDescendants, но так как ваш второй пример не имеет пространства имен для элемента xml, мы должны использовать пустое пространство имен для поиска дочерних элементов, как показано ниже. Кроме того, selectDescendants возвращает последовательность xml со всеми соответствующими элементами. Таким образом, чтобы получить нужный элемент XML, один из вариантов - получить к нему правильный индекс. Пример кода, как показано ниже.

import ballerina/io;

function main (string... args) {
    xml x = xml `<member>
    <sourcedid>
        <source>test1</source>
        <id>1234.567</id>
    </sourcedid>
    <entity>
        <sourcedid>
            <source>test2</source>
            <id>123</id>
        </sourcedid>
        <idtype>1</idtype>
    </entity>
    <entity>
        <sourcedid>
            <source>test</source>
            <id>123</id>
        </sourcedid>
        <idtype>2</idtype>
    </entity>
    </member>`;

    //Below would first find all the matched elements with "id" name and then get the first element
    xml x1 = x.selectDescendants("{}id")[0];
    io:println(x1);
}

Для поиска детей в дереве XML вы должны использовать selectDescendants метод. Из документации по типу xml;

<xml> selectDescendants(string qname) returns (xml)

Рекурсивно ищет в дочерних элементах элементы, соответствующие определенному имени, и возвращает последовательность, содержащую их все. Не выполняет поиск в сопоставленном результате.

Также вы должны использовать полное имя (QName) элемента. В вашем примере QName элемента города {http://www.test.com}city

Вот пример кода.

import ballerina/io;

function main (string... args) {
    xml payload = xml `<h:People xmlns:h="http://www.test.com">
        <h:name>Anne</h:name>
        <h:address>
            <h:street>Main</h:street>
            <h:city>Miami</h:city>
        </h:address>
        <h:code>4</h:code>
    </h:People>`;

    io:println(payload.selectDescendants("{http://www.test.com}city"));
}

Вы также можете использовать встроенную поддержку балерины для пространств имен XML и получить доступ к своему элементу следующим образом.

xmlns "http://www.test.com" as h;
io:println(payload.selectDescendants(h:city)); 
Другие вопросы по тегам