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

时间:2010-05-14 15:57:36

标签: .net xml xpath

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

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

我正在尝试使用XPath检索“Version”属性值。由于xmlns是在没有别名的情况下定义的,因此它会自动将xmlns分配给Settings节点。当我将这个XML读入XMLDocument并查看Settings节点的namespaceURI值时,它被设置为“urn:schemas-stuff-com”。

我试过了:

// Parent / Settings / @ Version - 返回Null

// Parent / urn:schemas-stuff-com:Settings / @ Version - 语法无效

3 个答案:

答案 0 :(得分:0)

解决方案取决于您使用的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处理器在节点之间更改时不会更改默认命名空间,但我不确定是否确实如此。

希望这有帮助。

答案 1 :(得分:0)

使用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
}

答案 2 :(得分:0)

除了Martin Honnen的正确答案,不幸的是实现和编程语言特定,这里是一个纯XPath解决方案

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