2009-06-24 15 views
23

Ho un documento XML come segue:C# LINQ to controllo XML se l'elemento esiste

<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> 

Sto cercando di verificare se il nodo numero di figlio del nodo padre SMS esiste nel documento (per scopi di convalida evitare di inserire dati duplicati).

Qualche consiglio su una possibile soluzione?

MODIFICA: L'elemento verrà confrontato con una stringa di input. Ad esempio if (inputNumber == xmlDocNumber) {// Non inserire un nuovo elemento}

+0

Potresti fornirci del codice di esempio (pseudo?) Per fornire un contesto e un'immagine più chiara di cui hai bisogno?> –

+0

Nessuno di questi funziona grr! – Goober

+1

in che modo il codice di esempio può aiutare .......... trovare un elemento specificato in un documento XML ....... cosa potrei darti oltre a quello che ho? – Goober

risposta

41

Suggerirò una virata leggermente diversa all'utilizzo di Count() - utilizzare Any(). Il vantaggio è che Any() può fermare, non appena si arriva eventuali partite a tutti:

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

In questo caso non farà molta probabilità, ma nei casi in cui Count() potrebbe avere a contare un milione di visite solo per dirti che ce n'era almeno uno, è un trucco utile da sapere. Direi che è anche un indicatore più chiaro di ciò che intendi.

+0

Come lo uso per il controllo? Scusa, sto ancora familiarizzando con LINQ – Blackator

+0

@Blackator: la parte 'Any' sta * facendo * il controllo. Non so quale problema stai affrontando, quindi è difficile essere più precisi. Forse dovresti fare una nuova domanda? –

+0

Per favore controlla la mia domanda [qui] (http://stackoverflow.com/questions/12276533/check-if-an-element-exists-in-xml). Grazie Jon – Blackator

0

Si potrebbe applicare un documento XSL che traduce i dati dal scorrendo i nodi SMS ed escludendo qualsiasi che ha un valore di numero duplicato/text()

Controllare sarebbe qualcosa di simile:

<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 domanda sta usando Linq to XML # –

1

Supponendo che hai il tuo numero in qualche forma canonicalized e il tuo XML viene caricato in un XmlDocument o qualcosa del genere, il più semplice modo non LINQ per farlo è con una query XPath:

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

La domanda sta usando Linq in XML –