2009-07-28 5 views
8

J'essaie de comprendre un problème que j'ai dans Linq to XML, il me semble que ce devrait être assez simple, mais même après avoir parcouru les questions Linq to XML ici, je ne peux pas tout à fait l'obtenir.Vérification de l'existence d'un élément enfant XML avec Linq to XML

Prenez quelque chose le long des lignes du code XML suivant:

<users> 
    <user id="1"> 
     <contactDetails> 
      <phone number="555 555 555" /> 
     </contactDetails> 
    </user> 
    <user id="2"> 
     <contactDetails /> 
    </user> 
</users> 

Je veux maintenant vérifier si l'utilisateur avec l'ID 2 a un numéro de téléphone.

Quelqu'un pourrait-il proposer une solution, comme je le disais semble, comme il devrait être simple ...

Cheers, Ola

Répondre

13

Voici une approche de recherche:

XElement yourDoc = XElement.Load("your file name.xml"); 

bool hasPhone = (
    from user in yourDoc.Descendants("user") 
    where (int)user.Attribute("id") == 2 
    select user.Descendants("phone").Any() 
    ).Single(); 
3

Il y a probablement une meilleure et Slicker façon de le faire (je ne suis pas mais terriblement familier avec LINQ to XML), mais cet extrait de code devrait fonctionner:

XElement yourDoc = XElement.Load("your file name.xml"); 

foreach (XElement user in yourDoc.Descendants("user")) 
{ 
    foreach(XElement contact in user.Descendants("contactDetails")) 
    { 
     var phone = contact.Descendants("phone"); 

     bool hasPhone = (phone.Count() > 0); 
    } 
} 

Il énumère essentiellement sur tous les « utilisateurs » noeuds dans votre XML, puis tous les « ContactDetails » noeuds à l'intérieur du noeud utilisateur, puis vérifiez pour voir s'il y a un "téléphone" sous-nœuds sous cela.

L'appel .Descendants() sera de retour une liste de nœuds XElement, et s'il n'y en a pas du type que vous enquis de la .Count() sur cette liste (un IEnumerable<T>) retournera 0 - c'est ce que mon code vérifie pour.

Marc

1

dans LINQ pour vous xml pouvez effectuer cette vérification rapide avant d'obtenir une valeur:

if (!xe.Root.Element("Date").IsEmpty) 
{ 
    pd.datefield = System.Convert.ToString(xe.Root.Element("Date").Value); 
} 

ne fonctionne pas avec les données NULL dans la base de données car il ne crée pas les étiquettes avec des données vides

pour ce que vous auriez à faire une boucle h les éléments enfants