如何使用SXD-XPath选择命名空间属性的值?

时间:2019-01-20 12:42:08

标签: xml parsing xpath rust rdf

我有以下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");

https://www.w3.org/1999/02/22-rdf-syntax-ns上似乎没有resource

@xml:id有效,但@rdf:resource无效。当然,在相同的背景下。

这个名称空间的东西真的很奇怪。如何选择rdf:resource的值?

1 个答案:

答案 0 :(得分:1)

根据the RDF RFC,RDF名称空间URI为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的作者