2009-08-24 10 views
0

Ich lerne nur Linq, und blieb auf, was ich hoffe, ist ziemlich einfach. Meine XML-Dokument ist wie:Lesen Sie einen bestimmten Elementwert basierend auf einem bestimmten Attribut in Linq?

<?xml version="1.0" encoding="utf-8"?> 
<XDOC> 
    ... 
    <ItemsDetail> 
     <Item name="Item1"> 
      <data1> 
       <Data type="classA">55</Data> 
       <Data type="classB">66</Data> 
      </data1> 
      <data2> 
       <Data type="classA">77</Data> 
       <Data type="classB">88</Data> 
      </data2> 
     </Item> 
    </ItemsDetail> 
</XDOC> 

Also habe ich oben in einen XDocument Typ meine XML laden und dann abfragen, die

var query = from p in ILSXml.Elements("XDOC").Elements("ItemsDetail").Elements("Item") 
      select p; 

Dann habe ich eine foreach auf auf die Abfrage ausführen.

foreach (var record in query) 
{ 
    Console.WriteLine("Name: {0}", record.Attribute("Name").Value); 
    Console.WriteLine("Data1 ClassA: {0}", record.Element("data1").Element("Data").Attribute("classA").Value); 
} 

So ist die Zeile:

Console.WriteLine("Data1 ClassA: {0}", record.Element("data1").Element("Data").Attribute("classA").Value); 

funktioniert nicht das, was ich ziemlich viel erwartet war. Muss ich eine weitere Reihe von Abfragen ausführen oder einige anonyme Inline-Methoden ausführen?

Oh, und bitte kommentieren Sie das XML nicht, es gehört mir nicht, ich muss nur damit arbeiten.

Antwort

2

Ich nehme an, dass Sie versuchen, den Wert 55 zu erhalten? Sie können die Methode First verwenden, um das erste "Data" -Element mit einem "type" -Attributwert von "classA" zu finden.

record.Element("data1") 
     .Elements("Data") 
     .First(data => data.Attribute("type").Value == "classA") 
     .Value 

Beachten Sie, dass die obige Lösung ziemlich zerbrechlich ist. Jede Änderung an der Struktur des XML-Eingabedokuments führt wahrscheinlich zu einer Nullreferenzausnahme.

Sie können XML-Dokumente auch mit der kompakteren XPath-Abfragesprache abfragen. XPath kann Elemente mithilfe eines einfachen Ausdrucks in eckigen Klammern filtern. Ihr Code würde dann in etwa so aussehen:

+0

Das funktioniert, ähnlich dem, was ich gerade sah, obwohl die .First fehlt. Gibt es eine empfohlene Methode, mit einem solchen XML-Dokument zu arbeiten? –

+0

Wenn Sie ein XSD-Dokument (XML-Schemadokument) erhalten, das Ihr Dokument beschreibt, dann würde ich auf jeden Fall versuchen, echte Klassen zu generieren und die Standard-XML-Serialisierung zu verwenden. –

Verwandte Themen