2009-06-24 16 views
23

que tienen un documento XML de la siguiente manera:C# LINQ to cheque XML si el elemento existe

<Database> 
<SMS> 
    <Number>"+447528349828"</Number> 
    <Date>"09/06/24</Date> 
    <Time>13:35:01"</Time> 
    <Message>"Stop"</Message> 
</SMS> 
<SMS> 
    <Number>"+447528349828"</Number> 
    <Date>"09/06/24</Date> 
    <Time>13:35:01"</Time> 
    <Message>"Stop"</Message> 
</SMS> 
</Database> 

Estoy tratando de comprobar si existe el nodo hijo número del nodo padre SMS en el documento (para fines de validación a evitar insertar datos duplicados).

¿Algún consejo sobre una posible solución?

EDITAR: El elemento se comparará con una cadena de entrada. Por ejemplo if (inputNumber == xmlDocNumber) {// No insertar elemento nuevo}

+0

¿Podría darnos algún código de muestra (pseudo?) Para proporcionar un contexto y una imagen más clara de sus necesidades> –

+0

¡Ninguno de estos trabajos grr! – Goober

+1

cómo podría ayudar el código de muestra .......... encontrar cualquier elemento especificado en un documento xml ....... ¿qué podría posiblemente darle además de lo que tengo? – Goober

Respuesta

41

Sugeriré una táctica ligeramente diferente para usar Count() - use Any(). La ventaja es que cualquier() puede parar tan pronto como se pone ninguna coincidencia en absoluto:

var smsWithNoNumber = main.Descendants("SMS") 
          .Where(x => !x.Elements("Number").Any()); 

En este caso no va a hacer mucho viento y marea, pero en los casos en que Count() podría tener que contar con un millón de visitas solo para decirte que había al menos uno, es un truco útil para saber. Yo diría que también es un indicador más claro de lo que quieres decir.

+0

¿Cómo uso esto para verificar? Lo siento, todavía estoy en el proceso de familiarizarme con LINQ – Blackator

+0

@Blackator: la parte 'Any' está * haciendo * el cheque. No sé qué problema enfrentas, por lo que es difícil ser más preciso. Tal vez deberías estar haciendo una nueva pregunta? –

+0

Por favor, consulte mi pregunta [aquí] (http://stackoverflow.com/questions/12276533/check-if-an-element-exists-in-xml). Gracias Jon – Blackator

0

Se podría aplicar un documento XSL que traduce los datos de bucle a través de los nodos de SMS y excluyendo cualquier que tenga un valor Número duplicado/texto()

Comprobar sería algo así como:

<xsl:template match="SMS"> 
<xsl:variable name="parentNode" select="." /> 
<xsl:if test="preceding-sibling::SMS/Number/text()=$parentNode/Number/text()"> 
.....include a copy of node...... 
</xsl:if> 
    </xsl:template> 
+0

La pregunta es usar Linq para XML # –

1

asumiendo que usted tiene su número en alguna forma canónica y el código XML se carga en un XmlDocument o algo así, la manera más simple no LINQ de hacerlo es con una consulta XPath:

string pattern = String.Format("/Database/SMS/Number[. = '{0}']", number); 
if (myDoc.SelectSingleNode(pattern) != null) 
{ 
    // number already exists in document 
} 
+0

La pregunta es usar Linq para XML –

Cuestiones relacionadas