代码之家  ›  专栏  ›  技术社区  ›  hedgar2017

如何选择具有sxd xpath的名称空间属性的值?

  •  0
  • hedgar2017  · 技术社区  · 6 年前

    我有以下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:资源 ?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Shepmaster Tim Diekmann    6 年前

    根据 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文档的作者

    推荐文章