2012-04-13 8 views
2

Ich bin sicher, das ist eine einfache Frage, aber ich kann es nicht herausfinden.Rufen Sie das Element 'value' ab, indem Sie nach 'name' suchen

Ich lade eine XML-Datei in einen String in C#, und es enthält Elemente in folgendem Format:

<attribute name="Make" value="Volvo" /> 
<attribute name="Color" value="Blue" /> 
<attribute name="Damage" value="Rear scratched" /> 
<attribute name="Damage" value="Left hand side dented" /> 

Und alles, was ich tun möchte, ist all des Wertes für „Damage bekommen "im gesamten Dokument (unabhängig davon, wo sie fallen) in ein Array. Ich habe mit XmlDocument/XmlNodeList gespielt, aber ich kann einfach nicht herausfinden, wie das funktioniert.

Ich bin halb versucht, es mit RegEx zu tun, aber das fühlt sich sehr sehr schmutzig. XDocument

+0

Verwenden Sie Linq zu XML = schnell und einfach Code zu lesen. http://msdn.microsoft.com/en-us/library/bb387098.aspx – Sogger

+0

Bitte Präfix Ihre Titel mit "XML/C#" und so. Dafür sind die Tags da. –

Antwort

7

Verwendung:

var doc = XDocument.Parse(xml); 
var result = doc.Descendants("attribute") 
       .Where(x => x.Attribute("name") != null && 
          x.Attribute("value") != null) 
       .Where(x => x.Attribute("name").Value == "Damage") 
       .Select(x => x.Attribute("value").Value) 
       .ToArray(); 

Bitte beachten Sie:
Dieser Code ist relativ einfach, weil es alle attribute Knoten in dem gesamten Dokument berücksichtigt.

+1

Vorbehalt: Die Liste der Attribute in der Frage funktioniert nicht mit diesem Code "wie-ist". Es gibt kein "Wurzelelement". Wenn die "attribute" -Elemente ein übergeordnetes "attributes" -Element haben, funktioniert dieses Codebeispiel perfekt. –

+0

@GlennFerrieLive: Das ist kein Problem mit diesem Code, aber mit den bereitgestellten Beispieldaten, denn das ist einfach kein gültiges XML und ich nahm an, dass das OP nur den relevanten Teil zeigte. –

+0

Ich stimme dir zu. –

1
string val = ""; 
XmlDocument doc = new XmlDocument(); 

doc.Load("file.xml"); 

XmlNodeList nodes = doc.SelectNodes("/attribute[@name='Damage']"); 

foreach (XmlNode node in nodes) 
{ 
    { 
     val = node.Attributes["value"].Value; 
    } 
} 

sollte funktionieren?

+1

Entschuldigung, der Code wurde bereits bearbeitet –

+0

@DanielHilgarth Code wurde seit meinem ursprünglichen Kommentar bearbeitet, den ich jetzt als Reaktion auf die Bearbeitung entfernen werde. – Sogger

1

Sie können LINQ-TO-XML nutzen, aber Sie müssen ihm eine korrekte XML-Datei zur Verfügung stellen. Erstellen Sie einfach einen Stammknoten manuell, andernfalls erhalten Sie System.Xml.XmlException : There are multiple root elements..

// raw - your XML 
string raw = File.ReadAllText("c:\\test1.xml"); 

// create root node manually 
string xml = "<root>" + raw + "</root>"; 
var xdoc = XDocument.Parse(xml);  

// contains IEnumerable<string> 
// TODO: add null-checks 
var damagedValues = xdoc.Descendants("attribute") 
         .Where(e => e.Attribute("name").Value == "Damage") 
         .Select(e => e.Attribute("value").Value); 
1

Nun, das ist kein XML-Dokument, es ist ein Fragment. Sie müssen es mit einem Root-Element umbrechen. Das wird funktionieren:

string fragment = File.ReadAllText("file.xml"); 
var doc = XDocument.Parse("<root>" + fragment + "</root>"); 

var values = from element in doc.XPathSelectElements(@"//attribute[@name='Damage']") 
      select element.Attribute("value").Value; 

values.ToList().ForEach(Console.WriteLine); 
Verwandte Themen