使用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个元素。
我在这里做错了什么?
我怀疑它失败的原因与属性部分无关-它根本找不到元素,因为您只要求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。