2010-04-13 12 views
9

OK, poco de una pregunta al azar, pero la mejor manera de hacerlo es solo agregar el código, podrá ver lo que quiero decir inmediatamente:C# compruebe que existe un elemento mientras usa LINQ to XML

XML:

<?xml version="1.0" encoding="utf-8" ?> 
<customers> 
    <customer> 
    <id>1</id> 
    <name>Blah-face</name> 
    <Type>1</Type> 
    </customer> 
    <customer> 
    <id>2</id> 
    <name>Blah-face-2</name> 
    <Type>2</Type> 
    </customer> 
    <customer> 
    <id>3</id> 
    <name>Blah-face-3</name> 
    <Type>1</Type> 
    <SuperType>1</SuperType> 
    </customer> 
</customers> 

C#:

XDocument linquee = XDocument.Load(path); 

var superType = (from c in linquee.Descendants("customer") 
       where (c.Element("SuperType").Value == "1") 
       select c).ToList(); 

Esto viene a colación con un error nulo - necesitaría añadir el elemento "supertipo" a cada cliente antes de que con un valor nulo, o es hay una solución que significaría que no tengo ¿Para hacer eso?

¡Salud!

Respuesta

13

Prueba esto:

var superType = (from c in from c in linquee.Descendants("customer") 
       where (string) c.Element("SuperType") == "1" 
       select c).ToList(); 

Básicamente si lanzas un nulo referencia XElement-string, obtendrá una referencia nula (que se puede comparar con el "1").

Una alternativa sería la de echar a int? cuales (IIRC) devolverá un valor nulo int? si el elemento no está presente, pero ir explosión si está presente, pero no numérico:

var superType = (from c in from c in linquee.Descendants("customer") 
       where (int?) c.Element("SuperType") == 1 
       select c).ToList(); 
+0

Perfecto, hace las cosas mucho más simples que comprobar nulos. "Marcará" en un momento. –

6

Usted debe ser capaz de simplemente añadir un cheque por nula

where c.Element("SuperType") != null 
&& [your other criteria] 
3

has necesitado comprobar si existe el elemento SuperType antes de tratar de leer el valor de ella?

... 
where (c.Element("SuperType") != null && c.Element("SuperType").Value == "1") 
... 
0

lo haría de esta manera:

var superType = linquee.Descendants("customer"). 
    Where(c => c.Element("SuperType") != null 
     && c.Element("SuperType").Value == "1"); 
0

también debe ser capaz de limpiar este tipo de cosas con las extensiones, algo así como ..

public string Element_valStr(XElement xElm, string xName) 
{ 
    if (xElm.Element(xName) == null) return string.empty; 
    return xElm.Element(xName).Value; 
} 

y luego simplemente:

var superType = (from c in linquee.Descendants("customer") 
        where (c.Element_valStr("SuperType") == "1") 
        select c).ToList(); 
0

he encontrado una solución agradable usando cualquier() en combinación con un operador condicional:

result = entry.Elements(ArbitraryElement).Any() ? (entry.Element(ArbitraryElement).Attributes(ArbitraryAttribute).Any() ? entry.Element(ArbitraryElement).Attribute(ArbitraryAttribute).Value : "-1") : "-1"

El truco es utilizar elementos() junto con cualquier() para verificar si el elemento existe (lo mismo para los Atributos())

Por lo tanto, para este ejemplo sería algo como esto:

var superType = from c in linquee.Descendants("customer") 
       select c.Elements("SuperType").Any() ? c.Element("SuperType").Value : "0"; 
Cuestiones relacionadas