2015-11-20 2 views
0

У меня есть документ XML, который выглядит следующим образом:Поиска по XDocument для XElement с определенным атрибутом, используя Linq

<Window x:Name="winName" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="My Window" SizeToContent="WidthAndHeight"> 
     <Grid ShowGridLines="true"> 
       <Grid.RowDefinitions> 
         <RowDefinition /> 
         <RowDefinition /> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
         <ColumnDefinition /> 
       </Grid.ColumnDefinitions> 
       <GroupBox x:Name="grBox" Header="Main Group Box" Grid.Row="0" Grid.Column="0" Grid.RowSpan="1" Grid.ColumnSpan="1" /> 
       <TabControl x:Name="tabControl" Grid.Row="1" Grid.Column="0" Grid.RowSpan="1" Grid.ColumnSpan="1"> 
         <TabItem x:Name="mainTab" Header="Main Tab" /> 
       </TabControl> 
     </Grid> 
</Window> 

Я хочу, чтобы мой код, чтобы найти XElement TabItem с й: Именем mainTab. Вот как выглядит мой код:

XDocument doc = XDocument.Load(path); 
XNamespace xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"; 
XNamespace xaml = "http://schemas.microsoft.com/winfx/2006/xaml"; 
IEnumerable<XElement> result = from myElems in doc.Descendants(xmlns + "Window") 
           where myElems.Attribute(xaml + "Name").Value == "mainTab" 
           select myElems; 

Но это не работает, результатов нет. Пожалуйста, порекомендуйте.

ответ

2

Пара проблем. Вы говорите Descendants() для поиска элемента с локальным именем Window, вы должны сказать ему, что он ищет элемент с локальным именем TabItem (элемент, который вы действительно хотите).

Во-вторых, вы получите NullReferenceException, если у вас есть TabItem, у которого нет атрибута x:Name; вы попытаетесь получить поле Value в нулевой ссылке, поэтому вы должны отдать результат Attribute() в строку и сравнить это.

Вот рабочий выбор:

IEnumerable<XElement> result = from myElems in doc.Descendants(xmlns + "TabItem") 
           where (string)myElems.Attribute(xaml + "Name") == "mainTab" 
           select myElems; 
+0

Большое спасибо, господин. Вы сделали мою жизнь лучше :) –

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