如何使用带有 Ballerina 的 Xpath 搜索 XML 有效负载中的元素?

How to search for an element in an XML payload using Xpath with Ballerina?

示例:如何使用 ballerina 访问 "city"?

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

我尝试使用 select 功能,但它 return 对我没有任何帮助。

payload.select("city")

要在 xml 树中搜索 children,您应该使用 selectDescendants 方法。来自 xml type;

的文档

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

Searches in children recursively for elements matching the qualified name and returns a sequence containing them all. Does not search within a matched result.

您还应该使用元素的完全限定名称 (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"));
}

您还可以利用 ballerina 对 xml namespaces 的内置支持,并通过以下方式访问您的元素。

xmlns "http://www.test.com" as h;
io:println(payload.selectDescendants(h:city)); 

我们可以使用相同的方法 selectDescendants 但由于您的第二个示例没有 xml 元素的命名空间,我们必须使用空命名空间来查找子元素如下。此外,selectDescendants returns 一个包含所有匹配元素的 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);
}