使用xpath选择所有具有属性的节点

本文关键字:属性 节点 使用 选择 xpath | 更新日期: 2023-09-27 18:08:00

我试图使用root.SelectNodes()XPath选择所有节点。有关参考,请参见msdn-documentation。

在下面的文档中解释,你也可以搜索包含属性的节点(如果这实际上是一个错误的理解请纠正我)。

所以我使用了下面这行代码:
XmlNodeList nodes = projectDoc.DocumentElement.SelectNodes("descendant::Compile[attribute::Include]");

我正在尝试读取以下数据:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
    <ItemGroup>
        <Compile Include="ArrayExtensions.cs" />
        <Compile Include="ArrayIterator.cs" />
        <Compile Include="AutoInitializeAttribute.cs" />
        <Compile Include="AutoInitializePriority.cs" />
        <Compile Include="AutoRegisterAttribute.cs" />
        <Compile Include="FormattableExtensions.cs" />
        <Compile Include="Mathematics'PrimeNumbers.cs" />
    </ItemGroup>
</Project>
如上面的代码样例所示,我想获得包含include -属性的所有xmlnode。然而,当我执行我的代码时,nodes包含0个元素。

我在这里做错了什么?

使用xpath选择所有具有属性的节点

我怀疑它失败的原因与属性部分无关-它根本找不到元素,因为您只要求Compile元素,而在URI http://schemas.microsoft.com/developer/msbuild/2003的名称空间中实际上只有Compile元素。

使用XPath完成此操作可能需要使用XmlNamespaceManager,然后将其传递给SelectNodes的另一个重载。我个人更倾向于使用LINQ to XML:

XDocument doc = XDocument.Load("myfile.xml");
XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";
var elements = doc.Descendants(ns + "Compile")
                  .Where(x => x.Attribute("Include") != null);

总的来说,我发现LINQ to XML是一个比"旧的"基于XmlDocument的API更干净的API。