Как получить доступ к элементу XML без пространства имен - PullRequest
1 голос
/ 25 января 2020

Следующий фрагмент кода работает и печатает <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.

Ответы [ 2 ]

2 голосов
/ 26 января 2020

Чтобы использовать синтаксис [] без использования префикса пространства имен 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]);
}
2 голосов
/ 25 января 2020

Я не уверен насчет вашей конкретной версии балерины, но попробуйте это:

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>
...