如何编写单个LINQ to XML查询来遍历所有子元素和子元素的所有属性?

我正在开发asp.net移动应用程序。 我使用XML作为数据库。 我正在查询XML以通过在.net中使用LINQ to XML来访问所需的元素和属性。 我的XML文件中有以下部分。

   Production Master Valve      Production Wing Valve     

在上面的XML文件中,我可以动态访问子元素节点’VALVE’及其属性’NAME’,而无需使用以下代码显式指定属性的名称。 因此,当在子节点“VALVE”中添加任何新属性时,我可以在不修改现有代码的情况下访问它。 对于这样的逻辑,我使用以下代码。 在以下代码中,ValvesProperties是Hashtable,它在“Valves”类中定义。

  static int count = 0; List LstValves = new List(); 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属性( ),然后它应该访问’DISPLAY-NODE’之间的文本( Production Master Valve ),然后它应该动态访问’COMMAND’节点的所有属性( )。 所有这些我想动态而不明确指定子节点的名称以及它们的属性名称(类似于我编写上述查询的方式)我们可以使用LINQ to XML编写这样的代码吗? 如果我们可以在单个逻辑中编写上述问题的代码会更好(类似于我编写上述查询的方式)。 您能否提供我可以解决上述问题的任何代码或链接?

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

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