2016-05-01 11 views
0

Ich versuche, den Wert eines Elements mithilfe eines XML-Attributs Kriterien zu erhalten. Im Wesentlichen möchte ich nur einen Wert aus dem gesamten Dokument und ich habe versucht, es direkt abzufragen. Das ist meine XML-Datei:C# - Holen Wert von Xml-Element mit seinem Attribut

<?xml version="1.0" encoding="UTF-8"?> 
<list version="1.0"> 
    <meta> 
     <type>resource-list</type> 
    </meta> 
    <resources start="0" count="1"> 
     <resource classname="Quote"> 
     <field name="name">Microsoft Corporation</field> <!-- I want this!!! --> 
     <field name="price">49.869999</field> 
     <field name="symbol">MSFT</field> 
     <field name="ts">1461960000</field> 
     <field name="type">equity</field> 
     <field name="utctime">2016-04-29T20:00:00+0000</field> 
     <field name="volume">48411684</field> 
     </resource> 
    </resources> 
</list> 

Insbesondere möchte ich das Feld mit dem Attribut "Name" darin. Dies ist, was ich getan habe, um dies zu erhalten:

  XDocument xDoc = XDocument.Parse(httpResponseBody); 
      string name = (string)xDoc.Elements("field").First(x => x.Attribute("name").Value == "name"); 

Ich bekomme einen Fehler "Element nicht übereinstimmende Sequenz". Wenn ich versuche, damit zu experimentieren oder etwas zu ändern, bekomme ich ein Objekt, das nicht auf den Referenzfehler eingestellt ist.

Ich spüre, dass ich eine einfache Parsing Fehler gemacht haben hier, aber jede Hilfe würde geschätzt (wie auch, wo ich schief gelaufen habe und was ich kann dies auch in Zukunft tun, um zu verhindern!)

Vielen Dank!

+1

'string name = xDoc.SelectSingleNode ("// field [@ name = 'name']"). InnerText' –

+0

Verwenden Sie 'Descendants (" field ")' anstelle von 'Elements (" field ")'. –

+0

@ MathiasR.Jessen mit LINQ ist bevorzugt, aber wenn Sie XPath verwenden müssen Sie 'xDoc.XPathSelectElement (...)'. Es gibt keine 'SelectSingleNode'-Methode für' XDocument'. –

Antwort

2

Die Elements Abfrage findet nur unmittelbare Kinder des aktuellen Knotens. d. h. Elements gibt nur das Wurzelelement list zurück.

Dies entweder bedeutet, dass Sie die Abfrage wie:

doc.Elements("list").Elements("resources").Elements(... 

Oder Sie Descendants verwenden können, die viele jeden Nachkomme des aktuellen Knotens, so:

var name = (string)doc.Descendants("field") 
    .First(x => (string)x.Attribute("name") == "name"); 
+0

Danke für die Erklärung, funktioniert jetzt perfekt :). – ForeverLearning

+0

Sauber und nett. Vielen Dank! –

Verwandte Themen