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

时间:2018-09-05 16:45:04

标签: 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>

我尝试使用select函数,但是它没有返回任何信息给我。

payload.select("city")

2 个答案:

答案 0 :(得分:1)

要在xml树中搜索子级,应该使用selectDescendants方法。来自xml type的文档;

  

<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 namespaces的支持,并通过以下方式访问您的元素。

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

答案 1 :(得分:1)

我们可以使用相同的方法 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);
}