使用 Linq 在 XDocument 中搜索具有特定属性的 XElement
Search through XDocument for XElement with certain Attribute using Linq
我有一个 XML 文档,如下所示:
<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 和 x:Name 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;
但这行不通,没有结果。请指教。
几个问题。您告诉 Descendants()
查找具有本地名称 Window
的元素,您应该告诉它查找具有本地名称 TabItem
的元素(您真正想要的项目) .
其次,如果您的 TabItem
没有 x:Name
属性,您将获得 NullReferenceException
;您将尝试在空引用上获取 Value
字段,因此您应该将 Attribute()
的 return 转换为字符串并进行比较。
这是工作 select:
IEnumerable<XElement> result = from myElems in doc.Descendants(xmlns + "TabItem")
where (string)myElems.Attribute(xaml + "Name") == "mainTab"
select myElems;
我有一个 XML 文档,如下所示:
<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 和 x:Name 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;
但这行不通,没有结果。请指教。
几个问题。您告诉 Descendants()
查找具有本地名称 Window
的元素,您应该告诉它查找具有本地名称 TabItem
的元素(您真正想要的项目) .
其次,如果您的 TabItem
没有 x:Name
属性,您将获得 NullReferenceException
;您将尝试在空引用上获取 Value
字段,因此您应该将 Attribute()
的 return 转换为字符串并进行比较。
这是工作 select:
IEnumerable<XElement> result = from myElems in doc.Descendants(xmlns + "TabItem")
where (string)myElems.Attribute(xaml + "Name") == "mainTab"
select myElems;