Как написать один запрос LINQ to XML, чтобы перебрать все дочерние элементы и все атрибуты дочерних элементов? - PullRequest
1 голос
/ 14 августа 2010

Я занимаюсь разработкой мобильного приложения asp.net. Я использую XML в качестве базы данных. Я запрашиваю XML для доступа к необходимым элементам и атрибутам, используя LINQ to XML в .net. У меня есть следующая часть в моем 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» и его атрибуту «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-документе я хочу написать запрос LINQ to XML, который может получить доступ к атрибуту NAME узла 'VALVE' (<VALVE NAME="PWV">), затем он должен получить доступ к тексту между DISPLAY-NODE (<DISPLAY-NAME> Production Master Valve </DISPLAY-NAME>) и затем он должен динамически обращаться ко всем атрибутам узла 'COMMAND' (<COMMANDS USE-TEMPLATE="TRUE" TEAMPLATE-NAME="ValveCommands.xml"></COMMANDS>). Все это мне нужно динамически, без явного указания имени дочернего узла, а также имени их атрибутов (аналогично тому, как я написал вышеупомянутый запрос). Можем ли мы написать такой код, используя LINQ to XML? Будет лучше, если мы сможем написать код для вышеуказанной проблемы в одной логике (аналогично тому, как я написал вышеупомянутый запрос). Можете ли вы предоставить мне любой код или ссылку, по которой я могу решить вышеуказанную проблему?

1 Ответ

0 голосов
/ 14 августа 2010

Вы можете просто перебрать все элементы и получить атрибуты для каждого:

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

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