如何使用带有 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);
}
示例:如何使用 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);
}