2009-07-28 21 views
8

Sto cercando di capire come funziona un problema che sto avendo in Linq in XML, sembra che dovrebbe essere piuttosto semplice, ma anche dopo aver sfogliato le domande da Linq a XML qui, non riesco a capirlo.Verifica se esiste un elemento figlio XML con Linq su XML

prendere qualcosa sulla falsariga di quanto segue XML:

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

Ora voglio controllare se l'utente con ID 2 ha un numero di telefono.

Qualcuno potrebbe suggerire una soluzione, come ho detto sembra, come dovrebbe essere semplice ...

Cheers, Ola

risposta

13

Ecco un approccio query:

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

C'è probabilmente un modo migliore e lisciante per fare questo (io non sono eppure terribilmente familiare con LINQ-to-XML), ma questo frammento di codice dovrebbe funzionare:

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); 
    } 
} 

Si enumera praticamente su tutti i nodi "utente" nel vostro XML e quindi tutte le "contactDetails" nodi all'interno del nodo utente, e poi controlla se c'è qualche "telefono" sottonodi sotto.

La chiamata .Descendants() tornerà indietro una lista di nodi XElement, e se non ce ne sono del tipo che domandato circa, il .Count() in tale elenco (un IEnumerable<T>) restituirà 0 - questo è ciò che il mio codice è il controllo per.

Marc

1

in LINQ to XML può fare questo rapido controllo prima di ottenere un valore:

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

non funziona con i dati NULL nel database in quanto non crea i tag con i dati vuoti

per quello che si dovrebbe loop throug h gli elementi figli

Problemi correlati