2010-11-22 5 views
1

ich aus SQL XML-String von mehreren Adressen, hier bin wieder zurück ein Beispiel dafür, was kehrt zurück:XDocument Verwendung zu suchen und extrahieren Daten

<Addresses> 
    <Address> 
    <LetterQueueOID>2</LetterQueueOID> 
    <Address1>115 MORNINGVIEW TRL</Address1> 
    <Address2>SCARBOROUGH, </Address2> 
    <Address3>M1B5L2</Address3> 
    <City>SCARBOROUGH</City> 
    <PostalCode>M1B5L2</PostalCode> 
    </Address> 
    <Address> 
    <LetterQueueOID>1</LetterQueueOID> 
    <Address1>GD PO BOX 685</Address1> 
    <Address2>THORNBURY, ON</Address2> 
    <Address3>N0H2P0</Address3> 
    <City>THORNBURY</City> 
    <ProvinceOrState>ON</ProvinceOrState> 
    <CountryCode>Ca</CountryCode> 
    <PostalCode>N0H2P0</PostalCode> 
    </Address> 
</Addresses> 

Ich möchte LINQ verwenden, um diese XML-Zeichenfolge abfragen für bestimmte LetterQueueOID der, dh Adresse auswählen (als String), wo LetterQueueOID = 2.

Alles, was ich herausgefunden habe, ist, dass ich XDocument verwenden kann, aber ich kann nicht genau herausfinden, wie zu bekommen, was ich will:

XDocument addresses = XDocument.Parse((string)returnScalar); 
IEnumerable<XElement> items = addresses.Root.Elements("Address").ToList(); 
+0

Sind Sie sicher, dass Sie XML für diese verwenden möchten? – svick

Antwort

3

versuchen, einen Lambda-Ausdruck mit dem Wo-Extension-Methode. hier ich erhalte die Adresse mit der ID 2, nur als Beispiel

XDocument addresses = XDocument.Parse((string)returnScalar); 
var address = addresses.Root.Elements("Address").Where(address => address.Element("LetterQueueOID").Value == "2").FirstOrDefault(); 
+0

Sie können mit 'Where()' auslassen und schreiben nur 'FirstOrDefault (Adresse => address.Element (" LetterQueueOID "). Value ==" 2 ")'. – svick

+0

Danke hat super funktioniert, das Problem, das ich hatte, ist, dass ich andere suchen sah, aber sie benutzten Knoten und der Wert musste innerhalb des Knotens liegen, d. H. . Jetzt weiß ich, was der Definitionsunterschied zwischen Knoten und Element ist – greektreat

1

Nun, können Sie tun:

var matches = addresses 
       .Root 
       .Elements("Address") 
       .Where(addr => (string) addr.Element("LetterQueueOID") == "2") 

jedoch, dass werden Sie alle relevanten <Address> Elemente erhalten. Sie sagen, Sie möchten die Adresse als String zurückbekommen - aber in welchem ​​Format?

Sie könnten die Saiten wie folgt verketten:

var matches = addresses 
       .Root 
       .Elements("Address") 
       .Where(addr => (string) addr.Element("LetterQueueOID") == "2") 
       .Select(addr => (string) addr.Element("Address1") + " " 
           (string) addr.Element("Address2") + " " 
           /* etc */);