Как искать элемент в полезной нагрузке 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));