2009-07-28 10 views
8

Estoy tratando de resolver un problema que tengo en Linq a XML, parece que debería ser bastante simple, pero incluso después de navegar las preguntas de Linq a XML aquí, no puedo entenderlo.Comprobando si existe un elemento hijo XML con Linq en XML

Tomar algo en la línea de la siguiente XML:

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

ahora quiere comprobar si el usuario con id 2 tiene un número de teléfono.

Podría alguien sugerir una solución, como ya he dicho parece, como tiene que ser simple ...

Saludos, Ola

Respuesta

13

Aquí hay un enfoque de consulta:

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

Probablemente hay una manera mejor y más pulido para hacer esto (no estoy sin embargo, muy familiar con LINQ to XML), pero este fragmento de código debería funcionar:

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

básicamente enumera más de todos los nodos de "usuario" en el XML, y luego todos los "Detalles contacto" nodos dentro del nodo de usuario, y luego verifique si hay algún "teléfono" subnodos debajo de eso.

La llamada .Descendants() regresará una lista de nodos XElement, y si no los hay del tipo que han consultado sobre la .Count() en esa lista (un IEnumerable<T>) devolverá 0 - eso es lo que mi código está comprobando.

Marc

1

en LINQ to XML que puede hacer esta comprobación rápida antes de obtener un valor:

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

no funciona con datos nulos en la base de datos, ya que no crea las etiquetas con los datos vacíos

para eso tendrías que hacer un bucle a través h los elementos secundarios

Cuestiones relacionadas