我正在尝试使用Linq过滤xmldata到Xml,问题是我无法使用XElement.Elements(Xname)方法获取元素但是在使用XElement.Desendents(Xname)方法时它工作正常但显示所有我不想要的元素。我想要它应该显示所有元素和属性,其元素和属性名称在两个文本框中传递。
XML:
<?xml version="1.0" ?>
<Summary AvailableRules="71000" SelectedRules="445" OmittedRules="6887">
<BBCE AvailableRules="69" SelectedRules="4" OmittedRules="65">
<SelectedRules>
<Rule RuleID="jc_0201" Priority="Strongly Recommended" />
<Rule RuleID="jc_0211" Priority="Strongly Recommended" />
<Rule RuleID="jc_0221" Priority="Strongly Recommended" />
<Rule RuleID="jc_0231" Priority="Strongly Recommended" />
</SelectedRules>
<OmittedRules>
<Rule RuleID="ar_0001" Priority="Mandatory" />
<Rule RuleID="ar_0002" Priority="Mandatory" />
<Rule RuleID="db_0143_a" Priority="Strongly Recommended" />
<Rule RuleID="db_0143_b" Priority="Strongly Recommended" />
<Rule RuleID="jc_0311" Priority="Mandatory" />
<Rule RuleID="jc_0321" Priority="Mandatory" />
<Rule RuleID="jc_0331" Priority="Mandatory" />
<Rule RuleID="jc_0341" Priority="Mandatory" />
<Rule RuleID="jc_0011" Priority="Strongly Recommended" />
<Rule RuleID="jc_0021" Priority="Strongly Recommended" />
<Rule RuleID="na_0004_a" Priority="Recommended" />
<Rule RuleID="na_0004_b" Priority="Recommended" />
<Rule RuleID="db_0043" Priority="Strongly Recommended" />
<Rule RuleID="db_0042" Priority="Strongly Recommended" />
<Rule RuleID="na_0005" Priority="Strongly Recommended" />
<Rule RuleID="jc_0081" Priority="Recommended" />
<Rule RuleID="jm_0002" Priority="Mandatory" />
<Rule RuleID="db_0142" Priority="Strongly Recommended" />
<Rule RuleID="jc_0061" Priority="Recommended" />
<Rule RuleID="db_0146" Priority="Strongly Recommended" />
<Rule RuleID="db_0140" Priority="Recommended" />
<Rule RuleID="jm_0013" Priority="Strongly Recommended" />
<Rule RuleID="db_0032" Priority="Strongly Recommended" />
<Rule RuleID="db_0141" Priority="Strongly Recommended" />
<Rule RuleID="jc_0171" Priority="Strongly Recommended" />
<Rule RuleID="jm_0010" Priority="Strongly Recommended" />
<Rule RuleID="jc_0281" Priority="Strongly Recommended" />
<Rule RuleID="na_0008" Priority="Recommended" />
<Rule RuleID="na_0009" Priority="Strongly Recommended" />
</OmittedRules>
</BBCE>
</Summary>
C#代码:
var button = sender as Button;
var parent = button.Parent as FrameworkElement;
//(Textbox to take element`s name)
var textBox = parent.FindName("textbox1") as TextBox;
var textbl = parent.FindName("abc") as TextBlock;
var com = parent.FindName("cbox1") as ComboBox;
//(Textbox to take ATTRIBUTE`s name)
var textBox1 = parent.FindName("textbox2") as TextBox;
XElement ele = XElement.Load(txtFileName.Text);
//working with Xelement.desendents it works fine
var fil = from item in ele.Elements(textbl.Text)
select item.Element(textBox.Text).Attribute(textBox1.Text);
foreach (var f in fil)
{
Label lb = new Label();
lb.Content = f;
canvas1.Children.Add(lb);
}
我观察到的是,当只使用BBCE元素时,它工作正常,但是在添加带有属性的Summary元素(Elements方法)时,它不起作用。
我错过了什么吗?
答案 0 :(得分:0)
Elements(name)方法返回节点的子元素。 Descendants(name)方法返回节点的后代元素。这是预期的行为。
因此,当您致电ele.Elements(textbl.Text)
时,搜索只会在ele
元素的直接子项之间进行。当您通过XElement ele = XElement.Load
加载文件时,ele
元素将成为xml的根元素。即您的案例中的<Summary>
元素。它有单个孩子<BBCE>
。这就是您在使用<BBCE>
方法进行搜索时只能找到Elements()
的原因。
Descendants()
方法将搜索文档中的任何元素,但<Summary>
节点本身除外。