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

时间:2010-08-14 08:16:56

标签: c# asp.net xml linq-to-xml

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

<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'&amp;它的属性'NAME'是动态的,不使用以下代码显式指定属性的名称。 因此,当在子节点“VALVE”中添加任何新属性时,我可以在不修改现有代码的情况下访问它。对于这样的逻辑,我使用以下代码。在下面的代码中,ValvesProperties是Hashtable,它在“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中,我想编写可以访问'VALVE'节点(<VALVE NAME="PWV">)的NAME属性的LINQ to XML查询,然后它应该访问'DISPLAY-NODE'之间的文本({{1} }),&amp;那么它应该动态地访问'COMMAND'节点的所有属性(<DISPLAY-NAME> Production Master Valve </DISPLAY-NAME>)。所有这些我想动态而不明确指定子节点的名称以及它们的属性名称(类似于我编写上述查询的方式)我们可以使用LINQ to XML编写这样的代码吗?如果我们可以在单个逻辑中编写上述问题的代码会更好(类似于我编写上述查询的方式)。您能否提供我可以解决上述问题的任何代码或链接?

1 个答案:

答案 0 :(得分:0)

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

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

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