2017-06-01 5 views
0

Ich habe das folgende XML-Schema auf, wo ich Linq verwenden möchte, um 2 Attribute abzufragen. Ich habe gesucht, aber nicht die richtige Lösung gefunden.So wählen Sie mehrere Attribute

<Object class="MA" Name="Sample"> 
    <bist name="act">false</bist> 
    <bist name="Dynamic">1234</bist> 
    <bist name="Fast">false</bist> 
    <bist name="plane">false</bist> 
    <bist name="Tnl">2232</bist> 
</Object> 

Für die xml oben, nachdem der Wert von „Dynamic“ bekommen und es mit oldTnl Variable, wenn gleich zu vergleichen, möchte ich wählen oder „Tnl“ Wert (2232) zu erhalten.

Derzeit teste ich mit diesem Code und erfolgreich den Wert von "Dynamic", aber ich möchte wirklich den Wert von "Tnl".

private void mGetTnlFromXML(string oldTnl) 
    { 
     XDocument doc = XDocument.Load("sample.xml"); 

     var bt = from p in doc.Descendants() 
        where (string)p.Attribute("name") == "Dynamic" 
        select p; 

     foreach (string b in bt) 
     { 
      if (b == oldTnl) 
      { 
       MessageBox.Show(b.ToString()); 
      } 
     } 
    } 

Etwas wie:

private void mGetTnlFromXML(string oldTnl) 
    { 
     XDocument doc = XDocument.Load("sample.xml"); 

     var bt = from p in doc.Descendants() 
        where (string)p.Attribute("name") == "Dynamic" 
        //is there are way i can also find "Tnl" here and use 
        //later? 
        select p; //or select "Tnl" here. 

     foreach (string b in bt) 
     { 
      if (b == oldTnl) 
      { 
       //select "Tnl" value (2232) 
       //use "Tnl" value (2232) 
       //do something.... 
      } 
     } 
    } 

Vielen Dank im Voraus ... ich noch LinQ lerne :).


Aktualisiert XML:

<Root> 
    <Data> 
    <Object class="MA" Name="Sample"> 
     <bist name="act">false</bist> 
     <bist name="Dynamic">1234</bist> 
     <bist name="Fast">false</bist> 
     <bist name="plane">false</bist> 
     <bist name="Tnl">2232</bist> 
    </Object> 
    </Data> 
</Root> 
+0

Sie wollen also den Wert des 'bist' Element, in dem der' Name 'bei Tribut ist ** "Tnl" ** und es gibt ein Geschwister 'bist' Element, das ein' Name' Attribut mit einem Wert von ** "dynamisch" hat **? –

+0

Ich brauche die Dynamik zum Vergleich dann werde ich das Tnl danach bekommen. Wenn die Dynamik nicht gleich ist oder nicht existiert, macht sie nichts. – mygtwo

Antwort

0

Es scheint mir, dass Sie dies wünschen:

private void mGetTnlFromXML(string oldTnl) 
{ 
    XDocument doc = XDocument.Load("sample.xml"); 
    var dynamic = doc.Root.Elements("bist").Where(x => x.Attribute("name").Value == "dynamic").First().Value; 
    if (dynamic == oldTnl) 
    { 
     var tnl = doc.Root.Elements("bist").Where(x => x.Attribute("name").Value == "Tnl").First().Value; 
     MessageBox.Show(tnl); 
    }; 
} 

, die unter der Annahme ist, dass Sie die gesamte XML in Ihrer Frage gezeigt haben. Wenn es nur Teil einer größeren XML-Datei ist, müssen Sie die ganze Sache zeigen.


Da Ihre XML mehr ist wie folgt:

<Root> 
    <Data> 
    <Object class="MA" Name="Sample"> 
     <bist name="act">false</bist> 
     <bist name="Dynamic">1234</bist> 
     <bist name="Fast">false</bist> 
     <bist name="plane">false</bist> 
     <bist name="Tnl">2232</bist> 
    </Object> 
    </Data> 
</Root> 

Dann wird der Code wahrscheinlich eher wie dieses sein würde:

private void mGetTnlFromXML(string oldTnl) 
{ 
    XDocument doc = XDocument.Load("sample.xml"); 
    foreach (var element in doc.Root.Element("Data").Elements("Object")) 
    { 
     var dynamic = element.Elements("bist").Where(x => x.Attribute("name").Value == "dynamic").First().Value; 
     if (dynamic == oldTnl) 
     { 
      var tnl = element.Elements("bist").Where(x => x.Attribute("name").Value == "Tnl").First().Value; 
      MessageBox.Show(tnl); 
     }; 
    } 
} 
+0

Das scheint OK. Ich werde es versuchen. Vielen Dank. Das ganze XML besteht immer wieder aus dem gleichen "Objekt". – mygtwo

+0

Ich bekomme Fehler, dass "Sequenz hat keine Elemente" auf der "var dynamic ...." und ich denke, es wird das gleiche mit "var tnl ...." in der if-Anweisung sein. – mygtwo

+0

@mygtwo - Ja, weil die von Ihnen gepostete XML nicht Ihr komplettes XML ist. Sie müssen das richtige XML bereitstellen, um den richtigen Code zu erhalten. – Enigmativity

0

die Verwendung von XML die Enigmativity vorgesehen, wir kann dies auf eine Zeile von XPath reduzieren:

XDocument xml = XDocument.Parse(@" 
<Root> 
    <Object class=""MA"" Name=""Sample""> 
    <bist name = ""act"" > false </bist > 
    <bist name = ""Dynamic"" > 1234 </bist > 
    <bist name = ""Fast"" > false </bist > 
    <bist name = ""plane"" > false </bist > 
    <bist name = ""Tnl"" > 2232 </bist > 
    </Object > 
    <Object class= ""MA"" Name = ""Sample"" > 
     <bist name = ""act"" > false </bist > 
     <bist name = ""Dynamic"" > 1234 </bist > 
     <bist name = ""Fast"" > false </bist > 
     <bist name = ""plane"" > false </bist > 
     <bist name = ""Tnl"" > 2232 </bist > 
    </Object > 
</Root >"); 

xml.XPathSelectElements("//Object[bist[@name='Dynamic']]/bist[@name='Tnl']").Dump(); 

Das übersetzt zu:

  • //Object[...] - das "Objekt" finden, die ....
  • bist[@name='Dynamic'] hat - ein "BIST" Element mit attrib "name" gleich "Dynamic"
  • /bist[...] - dann nehmen Sie die "BIST" Element unter diesem "Objekt", das hat ...
  • @name='Tnl' - Attribut "name" gleich zu "TNL"
+0

Danke ... Ich werde es versuchen. :) – mygtwo

+0

Hi, das funktioniert aber es ist nicht die Lösung für dieses spezielle Problem. Nochmals vielen Dank, ich habe auch von deinem Beitrag gelernt ... :) – mygtwo

Verwandte Themen