2013-02-22 94 views
1

我想过滤使用Linq到xml的xmldata,问题是我无法获取使用XElement.Elements(Xname)方法的元素,但是当使用XElement.Desendents(Xname)方法工作正常,但显示我不想要的所有元素。我想要什么它应该显示所有元素和属性,其元素和属性名称在两个文本框中传递。XElement.Elements(XName)方法无法读取具有属性的xml节点

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元工作进行时,但在添加汇总元素与属性(元法)won`工作。

我错过了什么吗?

回答

0

Elements(name)方法返回节点的子元素。 Descendants(name)方法返回节点的后代元素。那是预期的行为。

所以,当你打电话给ele.Elements(textbl.Text),那么搜索将只发生在ele元素的直接子女之间。当您通过XElement ele = XElement.Load加载文件时,则ele元素将是xml的根元素。即<Summary>元素在你的情况。它有单人小孩<BBCE>。这就是为什么当您使用Elements()方法进行搜索时只能找到<BBCE>

Descendants()方法在您的情况下将搜索文档中的任何元素,但节点本身除<Summary>之外。

+2

哦......知道了......再次感谢。 – Abhinav 2013-02-22 07:11:53