【问题标题】:What is wrong with my attribute-searching XPath query我的属性搜索 XPath 查询出了什么问题
【发布时间】:2013-01-23 05:12:27
【问题描述】:

我有一个 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 查询有什么问题?

【问题讨论】:

    标签: c# xml xpath xml-namespaces xmldocument


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      怀疑这部分是你的问题:

      @a:Source='foo.dll'
      

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

      试试吧:

      @Source='foo.dll'
      

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

      来自"Namespaces in XML 1.0 (3rd edition)" section 6.2(强调我的):

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-29
        • 2017-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-07
        • 1970-01-01
        • 2017-01-15
        相关资源
        最近更新 更多