Prüfung, ob ein Element vorhanden ist, prüfung von C-Linq zu XML

Ich habe ein XML-Dokument wie folgt:

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

Ich versuche zu überprüfen, ob der untergeordnete Knoten der Nummer des übergeordneten SMS-Knotens im Dokument vorhanden ist (zu Validierungszwecken, um das Einfügen doppelter Daten zu vermeiden).

Ratschläge zu einer möglichen Lösung?

EDIT: Das Element wird mit einer Eingabezeichenfolge verglichen. Zum Beispiel if(inputNumber == xmlDocNumber)' .''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Antwort auf "Prüfung, ob ein Element vorhanden ist, prüfung von C-Linq zu XML " 3 von antworten

Ich schlage eine etwas andere Tack als mit Count() - use - verwenden Sie Any(). The advantage is that Any() can stop as soon as it gets any matches at all: . Der Vorteil ist, dass Any() stoppen kann, sobald es überhaupt irgendwelche Matches bekommt:

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

In diesem Fall wird es nicht viel Chancen machen, aber in Fällen, in denen Count() might have to count a million hits just to tell you that there was at least one, it's a useful trick to know. I'd say it's also a clearer indicator of what you mean. möglicherweise eine Million Treffer zählen muss, nur um Ihnen zu sagen, dass es mindestens einen gab, ist es ein nützlicher Trick zu wissen. Ich würde sagen, es ist auch ein klarer Indikator dafür, was Sie meinen.

Sie können ein XSL-Dokument anwenden, das die Daten übersetzt, indem Sie die SMS-Knoten durchlaufen und alle, die einen doppelten Number/text()-Wert

haben, ausschließen.

Unter der Annahme, dass Sie Ihre Nummer in einer kanonischen Form haben und Ihr XML in eine XmlDocument or some such, the simplest non-LINQ way to do it is with an XPath query: oder so geladen wird, ist die einfachste Nicht-LINQ-Möglichkeit, dies zu tun, mit einer XPath-Abfrage:

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