我有以下提供给我的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 - 语法无效
答案 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