如何编写单个LINQ to XML查询以遍历所有子元素& amp;子元素的所有属性? [英] How to write a single LINQ to XML query to iterate through all the child elements & all the attributes of the child elements?

查看:64
本文介绍了如何编写单个LINQ to XML查询以遍历所有子元素& amp;子元素的所有属性?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发asp.net移动应用程序.我正在使用XML作为数据库.我正在查询XML以访问所需的元素&.NET中使用LINQ to XML设置属性.我的XML文件中包含以下内容.

I am developing asp.net mobile application. I am using XML as a database. I am querying on the XML to access the required elements & attributes by using LINQ to XML in .net. I have the follwing part in my XML file.

<VALVES>
     <VALVE NAME="PWV">
      <DISPLAY-NAME>
       Production Master Valve
      </DISPLAY-NAME>
      <COMMANDS USE-TEMPLATE="TRUE" TEAMPLATE-NAME="ValveCommands.xml"></COMMANDS>
    </VALVE>
    <VALVE NAME="PMV" >
     <DISPLAY-NAME>
      Production Wing Valve
     </DISPLAY-NAME>
     <COMMANDS USE-TEMPLATE="TRUE" TEAMPLATE-NAME="ValveCommands.xml"></COMMANDS>
    </VALVE>
</VALVES>

在上述XML文件中,我可以访问子元素节点"VALVE"&动态使用其属性"NAME",而无需使用以下代码明确指定属性的名称.因此,在子节点"VALVE"中添加了任何新属性后,我无需修改现有代码即可对其进行访问.对于这种逻辑,我正在使用以下代码.在以下代码中,ValvesProperties是哈希表,该哈希表在"Valves"类中定义.

In the above XML file I can access the the child element node 'VALVE' & its attribute 'NAME' dynamically without explicitly specifying the name of the attribute by using following code. Thus as any new attribute is added in the child node 'VALVE' I can access it without modifying my existing code. For such logic I am using following code. In the following code ValvesProperties is the Hashtable which is defined in the class 'Valves'.

 static int count = 0;
 List<Valves> LstValves = new List<Valves>();

 string AttName = null;
 string AttValue = null;

 XDocument FieldDef = XDocument.Load(@"F:\Shailesh from user OPC\XML\KK3.xml");
 XElement FieldRoot = FieldDef.Element("KK");

 count = FieldRoot.Element("FIELD-DEFINITION").Element("VALVES").Elements("VALVE").Count();
 Valves[] Valveobj = new Valves[count];

 count = 0;

 foreach (var element in FieldRoot.Element("FIELD-DEFINITION").Element("VALVES").Elements())
 {
     Valveobj[count] = new Valves();

     foreach (var attribute in element.Attributes())
     {
         AttName = attribute.Name.ToString();
         AttValue = attribute.Value.ToString();
         Valveobj[count].ValvesProperties.Add(AttName, AttValue);
         LstValves.Add(Valveobj[count]);
     }

     count++;
  }

return LstValves;

上面定义的XML部分需要类似的逻辑.在上面的XML中,我想编写LINQ to XML查询,该查询可以访问"VALVE"节点的NAME属性(< VALVE NAME ="PWV"> ),然后它应该访问'DISPLAY-NODE'(< DISPLAY-NAME>生产总阀</DISPLAY-NAME> )之间的文本,&那么它应该动态访问"COMMAND"节点的所有属性(< COMMANDS USE-TEMPLATE ="TRUE" TEAMPLATE-NAME ="ValveCommands.xml"></COMMANDS> ).我要动态地进行所有这些操作,而无需显式指定子节点的名称及其属性的名称(类似于我编写上述查询的方式),是否可以使用LINQ to XML编写这样的代码?如果我们可以用单个逻辑为上述问题编写代码,那会更好(类似于我编写上述查询的方式).您能提供解决上述问题的任何代码或链接吗?

The similar logic I need for the above defined XML part. In the above XML I want to write the LINQ to XML query which can access the NAME attribute of the 'VALVE' node (<VALVE NAME="PWV">), then it should access the text between 'DISPLAY-NODE' (<DISPLAY-NAME> Production Master Valve </DISPLAY-NAME>), & then it should access the all the attributes of the 'COMMAND' node dynamically ( <COMMANDS USE-TEMPLATE="TRUE" TEAMPLATE-NAME="ValveCommands.xml"></COMMANDS>). All these I want dynamically without explicitly specifying the name of the child node as well as name of their attributes ( similar to the way I written the above query ) Can we write such a code by using LINQ to XML ? It will be better if we can write code for above issue in a single logic ( similar to the way I written the above query ). Can you provide me the any code or link through which I can resolve the above issue ?

推荐答案

您可以遍历所有元素并检索每个元素的属性:

You could just iterate through all the elements and retrieve the attributes for each:

var allDescendants = myElement.DescendantsAndSelf();
var allDescendantsWithAttributes = allDescendants.SelectMany(elem =>
    new[] { elem }.Concat(elem.Attributes().Cast<XContainer>()));

foreach (XContainer elementOrAttribute in allDescendantsWithAttributes)
{
    // ...
}

这篇关于如何编写单个LINQ to XML查询以遍历所有子元素&amp; amp;子元素的所有属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆