如何在没有命名空间的情况下访问 XML 元素

How to access an XML element without a namespace

以下代码片段可以正常工作并按预期打印 <bar xmlns="x">bar</bar>

import ballerina/io;
public function main() {
    final xml x1 = xml `<foo xmlns="x">
        <bar>bar</bar>
    </foo>`;

    xmlns "x" as x;
    io:println(x1[x:bar]);
}

但是,如果不涉及 XML 个命名空间,如下面的代码片段所示,我会收到意外的编译错误:undefined symbol 'bar'.

import ballerina/io;
public function main() {
    final xml x1 = xml `<foo>
        <bar>bar</bar>
    </foo>`;

    // compilation error: undefined symbol 'bar'
    io:println(x1[bar]);
}

没有名称空间时如何访问 XML 元素?例如。 xmlns "" as x;也是编译错误。

我正在使用 Ballerina 1.1.0。

我不确定你的 Ballerina 版本,但试试这个:

import ballerina/io;
public function main() {
    final xml x = xml `<foo>
        <bar>bar</bar>
    </foo>`;


   xml x1 = x.selectDescendants("{}bar");
    io:println(x1);
}

我的输出:

<bar>bar</bar>

要在不使用 xml 命名空间前缀的情况下使用 [] 语法,您可以使用字符串文字来指定您想要的元素。这称为扩展形式,其中您在花括号中为名称空间添加前缀。当您没有定义命名空间时,您可以忽略命名空间前缀而只使用元素名称。

import ballerina/io;
public function main() {
    final xml x1 = xml `<foo>
        <bar>bar</bar>
    </foo>`;

    // simple element name
    io:println(x1["bar"]);

    final xml x2 = xml `<foo>
        <ns:bar xmlns:ns="ns.uri.com">bar</ns:bar>
    </foo>`;

    // xml element name in expanded form
    io:println(x2["{ns.uri.com}bar"]);
    // We can also define the namespace prefix and use it to access
    xmlns "ns.uri.com" as ns;
    io:println(x2[ns:bar]);
}