Как запросить дочерние элементы определенного родительского элемента - PullRequest
1 голос
/ 16 августа 2010

Я занимаюсь разработкой мобильного приложения asp.net. Я использую XML в качестве базы данных. Я использую следующую часть XML-файла для запроса данных с помощью LINQ to XML.

<USER-INTERFACE-DEFINITION>
      <MIMICS>
       <MIMIC ID="1" NAME="Home">
        <SECTIONS>
         <SECTION ID ="1" NAME="System Health" CONTROL-TYPE="Button">
          <DATAITEMS>
          </DATAITEMS>
         </SECTION>
         <SECTION ID ="2" NAME="Network Status" CONTROL-TYPE="Button">
          <DATAITEMS>
          </DATAITEMS>
         </SECTION>
         <SECTION ID ="3" NAME="ESD Status" CONTROL-TYPE="Button">
          <DATAITEMS>
          </DATAITEMS>
         </SECTION>
         <SECTION ID ="4" NAME="DWPLEM" CONTROL-TYPE="Button">
          <DATAITEMS>
          </DATAITEMS>
         </SECTION>
         <SECTION ID="5" NAME="Manifolds" CONTROL-TYPE="Drowpdown">
          <DATAITEMS>
          </DATAITEMS>
         </SECTION>
         <SECTION ID ="6" NAME="Wells" CONTROL-TYPE="Drowpdown">
          <DATAITEMS>
          </DATAITEMS>
         </SECTION>
         <SECTION ID ="7" NAME="Alarms" CONTROL-TYPE="Button">
          <DATAITEMS>
          </DATAITEMS>
         </SECTION>
         <SECTION ID ="8" NAME="House Keeping" CONTROL-TYPE="Button">
          <DATAITEMS>
          </DATAITEMS>
         </SECTION>
        </SECTIONS>
       </MIMIC>
    </USER-INTERFACE-DEFINITION>

В приведенном выше XML-файле я хочу получить атрибут "NAME" узла SECTION с условием MIMIC ID = "1" Я не хочу изменять свой существующий файл XML. У меня есть серверная коллекция узла с элементами simialr как XML-файл выше. Можете ли вы предоставить мне какой-либо код или ссылку, по которой я могу решить вышеуказанную проблему?

Ответы [ 4 ]

3 голосов
/ 16 августа 2010
var xml = XElement.Parse("your xml");
var q = from m in xml.Descendants("MIMIC")
        where (int)m.Attribute("ID") == 1
        from s in m.Descendants("SECTION")
        select (string)s.Attribute("NAME");

foreach ( var name in q ) {
    Console.WriteLine(name);
}

Я протестировал вышеупомянутое в LINQPad, и оно действительно выдает:

    System Health
    Network Status
    ESD Status
    DWPLEM
    Manifolds
    Wells
    Alarms
    House Keeping
0 голосов
/ 16 августа 2010

Если ваш XML содержится в строке с именем xml, тогда:

var root = XElement.Parse(xml);
var results = root
            .Descendants("MIMIC")
            .Where( e => e.Attribute("ID").Value == "1" )
            .SelectMany(e => e.Descendants("SECTION").Attributes("NAME" ) ) ;
0 голосов
/ 16 августа 2010

Я сделаю все возможное, но вы, возможно, не захотите предоставлять соответствующую часть XML, чтобы нам было легче.Есть ли у раздела это условие или название.По крайней мере, я мог бы начать с вас.

Давайте начнем с этого:

var name = xml.Descendants<SECTION>.Where(s => s.id == 1).GetFirstChild<NAME>();

Надеюсь, я не уйду, если это так, я думаю, кто-то ответит лучше.1006 *

Хорошо, после просмотра вашего XML я был в некотором отдалении.Также, когда я думаю об этом, потомки, вероятно, не будут работать.

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

Возможно, что-то вроде (не LINQ, но вы можете использовать его с LINQ, если хотите):

var nodes = myXmlDoc.SelectNodes("/USER-INTERFACE-DEFINITION/MIMICS/MIMIC[@ID='1']/SECTION/@NAME");
foreach(var node in nodes)
{
    string name = node.Value;
    // do something with each name
}

(предполагается, что myXmlDoc создан с использованием .Load(yourXmlFileHer) и предполагается, что USER-INTERFACE-DEFINITION является корнем XML, в противном случае вместо этого начните с //)

...