2016-10-15 8 views
1

Я изо всех сил пытался получить некоторые узлы моего XML. Проблема в том, что узел может присутствовать или не присутствовать на n-м уровне. я поделился мой XML ниже:Как получить некоторые конкретные узлы XML, представленные только несколькими родителями, использующими LINQ для XML?

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
    <Filter Include="Header Files"> 
     <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> 
     <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> 
    </Filter> 

    <Filter Include="Source Files - BT"> 
     <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> 
     <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> 
    </Filter> 

    <Filter Include="Source Files - BT\TreeViewsnTraversals"> 
     <UniqueIdentifier>{b685be7e-9d62-4f78-817c-def75db39d24}</UniqueIdentifier> 
    </Filter> 
    </ItemGroup> 

    <ItemGroup> 
    <ClCompile Include="..\4_Trees\SizeofBTree_Iterative.cpp"> 
     <Filter>Source Files - BT\TreeProperties</Filter> 
    </ClCompile> 
    <ClCompile Include="..\4_Trees\SizeofBTree_Recursive.cpp"> 
     <Filter>Source Files - BT\TreeProperties</Filter> 
    </ClCompile> 
    <ClCompile Include="..\4_Trees\LevelOrder_Left2Right.cpp"> 
     <Filter>Source Files - BT\TreeViewsnTraversals</Filter> 
    </ClCompile> 
    <ClCompile Include="..\4_Trees\LevelOrder_Right2Left.cpp"> 
     <Filter>Source Files - BT\TreeViewsnTraversals</Filter> 
    </ClCompile> 
    <ClCompile Include="..\4_Trees\PrintLeaftoNode.cpp"> 
     <Filter>Source Files - BT\TreeViewsnTraversals</Filter> 
    </ClCompile> 
    <ClCompile Include="..\4_Trees\VerticalOrderSUM.cpp"> 
    </ItemGroup> 
</Project> 

Как извлечь только «ClCompile» узлы (вместе с соответствующими «Фильтр» узлов)

Как вы можете видеть, это ClCompile присутствует как узел-потомк для «ItemGroup» и ItemGroup может содержать или не содержать ClCompile.

Я попытался использовать LINQ для XML в синтаксисе C#, и мне не удалось!

XElement filterxml = XElement.Load(filterfilepath); 
var sourcefiles = filterxml.Elements("Project").Elements("ItemGroup").Elements("ClCompile"); 

Как это сделать?

ответ

2

Только не забудьте использовать пространство имен по умолчанию XML

var xDoc = XDocument.Load(filename); 
XNamespace ns = xDoc.Root.GetDefaultNamespace(); 
//OR XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003"; 

var nodes = xDoc.Descendants(ns + "ClCompile").ToList(); 

Чтобы получить элемент фильтра, все, что вам нужно, это

var filter = nodes[i].Element(ns + "Filter"); 
+0

Спасибо .. Это работает. Не могли бы вы объяснить больше о XNamespace? –

Смежные вопросы