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

查询存在默认命名空间节点的值

  •  1
  • Jay  · 技术社区  · 14 年前

    我有以下XML提供给我,我无法更改它:

    <Parent>
      <Settings Version="1234" xmlns="urn:schemas-stuff-com"/>
    </Parent>
    

    我正在尝试使用xpath检索“version”属性值。因为xmlns是在没有别名的情况下定义的,所以它会自动将xmlns分配给设置节点。当我将这个XML读取到一个XML文档中并查看设置节点的namespaceuri值时,它被设置为“urn:schemas-stuff-com”。

    我已经尝试过:

    //父级/设置/@版本 返回空值

    //父级/urn:schemas-stuff-com:settings/@version -无效语法

    3 回复  |  直到 14 年前
        1
  •  0
  •   finrod    14 年前

    解决方案取决于您使用的XPath版本。在xpath 2.0中,以下内容应该有效:

    declare namespace foo = "urn:schemas-stuff-com";
    xs:string($your_xml//Parent/foo:Settings/@Version)
    

    另一方面,在xpath 1.0中,我唯一能成功使用的解决方案是:

    //Parent/*[name() = Settings and namespace-uri() = "urn:schemas-stuff-com"]/@Version
    

    在我看来,当xpath处理器在节点之间更改时,它不会更改默认的名称空间,尽管我不确定是否真的如此。

    希望这有帮助。

        2
  •  0
  •   Martin Honnen    14 年前

    使用xmlnamespacemanager:

    XmlDocument doc = new XmlDocument();
    doc.Load("file.xml");
    
    XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
    mgr.AddNamespace("foo", "urn:schemas-stuff-com");
    
    XmlElement settings = doc.SelectSingleNode("Parent/foo:Settings", mgr) as XmlElement;
    if (settings != null)
    {
      // access settings.GetAttribute("version") here
    }
    
    // or alternatively select the attribute itself with XPath e.g.
    XmlAttribute version = doc.SelectSingleNode("Parent/foo:Settings/@Version", mgr) as XmlAttribute;
    if (version != null)
    {
      // access version.Value here
    }
    
        3
  •  0
  •   Dimitre Novatchev    14 年前

    除了Martin Honnen的正确答案(不幸的是,这是具体的实现和编程语言)之外, 这里有一个纯粹的XPath解决方案 :

    /*/*[name()='Settings ']/@Version