首页 > 解决方案 > 如何处理foreach中的xml?--> 不兼容的类型:预期的 'xml',找到 '(xml|string)'

问题描述

有人可以帮助我了解 xml 元素在 foreach 语句中是如何工作的吗?

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

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

测试.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)'

我正在使用芭蕾舞女演员 1.2

标签: ballerina

解决方案


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

  2. 在程序执行期间,迭代器不会返回string结果,因此您可以安全地将persontoxml或类型保护(类型测试)强制转换,如下所示。

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

或者,您也可以.forEach对 xml 值进行方法。

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

推荐阅读