xdocument tutorial query net manejo leer example ejemplos dinamico c# xml linq linq-to-xml

tutorial - system xml linq example c#



C#Linq a XML comprueba si el elemento existe (3)

Tengo un documento XML de la siguiente manera:

<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 verificar si el número del nodo secundario del nodo de SMS principal existe en el documento (con fines de validación para evitar la inserción de datos duplicados).

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

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


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

El cheque sería algo 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>


Sugeriré una táctica ligeramente diferente a usar Count() - use Any() . La ventaja es que Any () puede detenerse tan pronto como obtenga alguna coincidencia:

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

En este caso no tendrá muchas probabilidades, pero en los casos en que Count() tenga que contar un millón de visitas solo para decirle que hubo al menos una, es un truco útil que debe saber. Yo diría que también es un indicador más claro de lo que quieres decir.


Suponiendo que tiene su número en alguna forma canonicalizada y su XML está cargado en un XmlDocument o algo así, la forma más simple de no hacerlo de LINQ es con una consulta XPath:

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