Как искать элемент в полезной нагрузке XML, используя Xpath с Ballerina? - PullRequest
0 голосов
/ 05 сентября 2018

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

<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 ]

0 голосов
/ 06 сентября 2018

Мы можем использовать тот же метод 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);
}
0 голосов
/ 06 сентября 2018

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

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

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

Также вы должны использовать полное имя (QName) элемента. В вашем примере значение QName элемента city равно {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)); 
...