Как выбрать значение атрибута пространства имен с помощью SXD-XPath? - PullRequest
0 голосов
/ 20 января 2019

У меня есть следующий XML:

<ultradata xml:id="deadbeef" rdf:resource="http://some-resource/ultralink">Some stuff</ultradata>

Я хочу получить значение rdf:resource, но не могу понять, как сделать пространство имен. Моя регистрация пространства имен:

let mut context = sxd_xpath::Context::new();
context.set_namespace("xml", "http://www.w3.org/XML/1998/namespace");
context.set_namespace("rdf", "https://www.w3.org/1999/02/22-rdf-syntax-ns");

Кажется, что нет resource в https://www.w3.org/1999/02/22-rdf-syntax-ns.

@xml:id работает, а @rdf:resource - нет. Из того же контекста, конечно.

Этот материал пространства имен действительно странный. Как я могу выбрать значение rdf:resource?

1 Ответ

0 голосов
/ 20 января 2019

Согласно RDF RFC , URI пространства имен RDF равен http://www.w3.org/1999/02/22-rdf-syntax-ns#.

Предполагая, что ваш входной XML правильно определяет это пространство имен:

<?xml version="1.0"?>
<outer xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <ultradata xml:id="deadbeef" rdf:resource="http://some-resource/ultralink">Some stuff</ultradata>"
</outer>

Тогда вам нужно использовать то же пространство имен в коде:

static INPUT: &str = r##"<?xml version="1.0"?>
<outer xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <ultradata xml:id="deadbeef" rdf:resource="http://some-resource/ultralink">Some stuff</ultradata>"
</outer>
"##;

fn main() {
    let package = sxd_document::parser::parse(INPUT).expect("Invalid XML");
    let doc = package.as_document();

    let mut context = sxd_xpath::Context::new();
    context.set_namespace("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");

    let xpath = sxd_xpath::Factory::new().build("//@rdf:resource").expect("Invalid XPath").expect("No XPath");
    let value = xpath.evaluate(&context, doc.root()).expect("Cannot evaluate XPath");

    if let sxd_xpath::Value::Nodeset(ns) = value {
        for n in ns {
            println!("{:?}", n);
        }
    }
}

Отказ от ответственности: я являюсь автором SXD-XPath и SXD-Document

...