如何在foreach中处理xml? --> 不兼容的类型:预期 'xml',找到 '(xml|string)'

How to handle xml inside foreach? --> incompatible types: expected 'xml', found '(xml|string)'

有人可以帮助我了解 xml 元素如何针对 foreach 语句工作吗?

下面的示例代码展示了访问 xml 元素“Child”的两种不同方式。首先,直接访问所有“Child”(第 3 行),然后仅访问 foreach 循环内特定“Person”的“Child”(第 5 行)。

  1. 为什么会出现编译错误?
  2. 在遍历所有“Person”时,我需要做什么才能访问特定“Person”的所有“Child”元素?

test.bal:

function foo(xml input) returns boolean{
  xml listOfPersons = input/<Person>;
  xml listOfChildren = input/<Person>/<Child>;
  foreach var person in listOfPersons{
    xml childrenOfSinglePerson = person/<Child>;
  }
}

编译结果:

Compiling source
        test.bal
error: .::test.bal:5:20: incompatible types: expected 'xml', found '(xml|string)'

我正在使用 Ballerina 1.2

  1. 此错误是由于 xml 迭代器类型检查中的错误造成的。 https://github.com/ballerina-platform/ballerina-lang/issues/24562

  2. 在程序执行期间迭代器不会 return string 结果因此你可以安全地将 person 转换为 xml 或者你类型保护(类型测试)如下所示。

function foo(xml input) returns boolean {
  xml listOfPersons = input/<Person>;
  xml listOfChildren = input/<Person>/<Child>;
  foreach var person in listOfPersons {
    if (person is xml) { // Workaround to only consider xml
        xml childrenOfSinglePerson = person/<Child>;
        return true;
    }
  }
}

或者您也可以在 xml 值上使用 .forEach 方法。

listOfPersons.forEach(function (xml person) { xml c = person/<Child>; io:println(c); });