2010-11-22 4 views
1

Je suis de retour en arrière de sql une chaîne XML d'adresses multiples, voici un exemple de ce qui est de retour en arrière:En utilisant XDocument pour rechercher et extraire des données

<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> 

Je veux utiliser LINQ pour interroger cette chaîne xml Tout ce que j'ai compris, c'est que je peux utiliser XDocument, mais je n'arrive pas à comprendre exactement comment obtenir ce que je veux:

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

Etes-vous sûr de vouloir utiliser XML pour cela? – svick

Répondre

3

essayer une expression lambda avec la méthode Where d'extension. ici je reçois l'adresse avec l'ID 2, juste comme un exemple

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

Vous pouvez omettre 'l'aide de' Where() 'et écrire simplement' FirstOrDefault (address => address.Element ("LetterQueueOID"). Value == "2") '. – svick

+0

Merci a bien fonctionné, le problème que j'avais était de voir d'autres recherches mais ils utilisaient des nœuds et la valeur devait être à l'intérieur du nœud, c'est-à-dire . Donc maintenant je sais quelle est la différence de définition entre Node et Element – greektreat

1

Eh bien, vous pouvez faire:

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

Cependant, que vous obtiendrez tous les éléments pertinents <Address>. Vous dites que vous voulez récupérer l'adresse sous forme de chaîne - mais dans quel format?

Vous pouvez concaténer les chaînes comme ceci:

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