我的属性搜索XPath查询有什么问题

本文关键字:什么 问题 查询 XPath 属性 搜索 我的 | 更新日期: 2023-09-27 17:58:07

我有一个XPath查询,它看起来很正确,但没有返回任何结果。

正在测试的XML文档:

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Deployment.Parts>
    <AssemblyPart x:Name="foo" Source="foo.dll" />
  </Deployment.Parts>
</Deployment>

代码:

Xml = new XmlDocument();
Xml.LoadXml(text);
Manager = new XmlNamespaceManager(Xml.NameTable);
//use constants for namespaces to make more readable
Manager.AddNamespace("a", NS_DEPLOYMENT_2007); //use 'a' for default namespace here so xpath is easier
Manager.AddNamespace("x", NS_XAML_2006); 
string xpath="//a:Deployment.Parts/a:AssemblyPart[@a:Source='foo.dll']";
var tmp = Xml.SelectNodes(xpath, Manager);

这里的XPath查询有什么问题?

我的属性搜索XPath查询有什么问题

您需要从属性中删除名称空间前缀:

string xpath="//a:Deployment.Parts/a:AssemblyPart[@Source='foo.dll']";

如果明确定义了名称空间,则只需要为属性指定名称空间,因此当您想要查询Name属性时,必须添加它:

string xpath="//a:Deployment.Parts/a:AssemblyPart[@x:Name='foo']";

I怀疑这部分是您的问题:

@a:Source='foo.dll'

与元素名称不同,属性名称不继承命名空间。您的文档没有为属性指定命名空间,所以我认为您也不应该这样做。

试试看:

@Source='foo.dll'

(顺便说一句,我个人会使用LINQ to XML而不是XPath——我发现它通常更简单。YMMV,但它可能值得考虑——当然,如果你使用的是.NET 3.5或更高版本。)

从";XML 1.0中的名称空间(第三版)";第6.2节(重点矿井):

默认名称空间声明的范围从它出现的开始标记的开始延伸到相应的结束标记的结束,不包括任何内部默认名称空间的声明的范围。在空标记的情况下,作用域就是标记本身。

默认的命名空间声明应用于其范围内所有未固定的元素名称默认名称空间声明不直接应用于属性名称;未固定属性的解释由它们出现的元素决定