简体   繁体   中英

XElement.Elements(XName) method unable to read xml nodes having attributes

I am trying to filter the xmldata using Linq to Xml,the problem is i am not able to get the elements using XElement.Elements(Xname) method but when working with XElement.Desendents(Xname) method it works fine but displays all the element which i don`t want. What i want it it should displays all the element and attributes,whose element and attribute name is passed in the two textboxes.

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# code:

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);
}

What I observed was when working with only BBCE element it works fine,but on adding Summary element with attribute (Elements method) won`t work.

Am I missing something?

Elements(name) method returns child elements of node. Descendants(name) method returns descendant elements of node. Thats expected behavior.

So, when you are calling ele.Elements(textbl.Text) then search will occur only between direct children of ele elements. When you are loading file via XElement ele = XElement.Load , then ele element will be root element of xml. Ie <Summary> element in your case. It has single child <BBCE> . That's why you can find only <BBCE> when you are using Elements() method to search.

Descendants() method in your case will search for any element in document, except <Summary> node itself.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM