2009-06-24 23 views
23

ich ein XML-Dokument haben, wie folgt:C# Linq to XML prüfen, ob Element vorhanden ist

<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, ob die Zahl Kindknoten des Eltern SMS Knoten zu überprüfen in dem Dokument vorhanden ist (zu Validierungszwecken zu Vermeiden Sie das Einfügen doppelter Daten).

Irgendwelche Ratschläge für eine mögliche Lösung?

EDIT: Das Element wird an einer Eingabezeichenfolge verglichen werden. Zum Beispiel if (inputNumber == xmlDocNumber) {// Kein neues Element einfügen}

+0

Könnten Sie uns einen Beispielcode (Pseudo?) Geben, um einen Kontext und ein klareres Bild Ihrer Bedürfnisse zu liefern? –

+0

Keiner von diesen funktioniert grr! – Goober

+1

Wie würde Beispielcode helfen .......... finde irgendein spezifiziertes Element in einem xml Dokument ....... was könnte ich dir möglicherweise geben außer was ich habe? – Goober

Antwort

41

Ich schlage eine etwas andere Verwendung vor als Count() - verwende Any(). Der Vorteil ist, dass jeder() stoppen kann, sobald es überhaupt keine Treffer bekommt:

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

In diesem Fall wird es nicht viele Chancen, aber in Fällen, in denen Count() könnte eine Million Zugriffe zu zählen haben nur um dir zu sagen, dass es mindestens einen gab, ist es ein nützlicher Trick, um es zu wissen. Ich würde sagen, es ist auch ein deutlicher Hinweis darauf, was Sie meinen.

+0

Wie benutze ich das zur Überprüfung? Sorry, ich bin gerade dabei, mich mit LINQ vertraut zu machen. – Blackator

+0

@Blackator: Der 'Any' Teil macht * den * check. Ich weiß nicht, mit welchem ​​Problem Sie konfrontiert sind, deshalb ist es schwer, genauer zu sein. Vielleicht solltest du eine neue Frage stellen? –

+0

Bitte überprüfen Sie meine Frage [hier] (http://stackoverflow.com/questions/12276533/check-if-an- element-exists-in-xml). Danke Jon – Blackator

0

Sie könnten eine XSL-Dokument anwenden, das die Daten durch Looping durch die SMS-Knoten und ohne jede, die eine doppelte Anzahl hat übersetzt/text() Wert

prüfen wäre so etwas wie:

<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

Die Frage verwendet Linq zu XML # –

1

Unter der Annahme, dass Sie Ihre Nummer in einiger kanonisierten Form haben und Ihre XML geladen wird in eine XmlDocument oder so, ist die einfachste nicht-LINQ Art und Weise ist es mit einer XPath-Abfrage zu tun:

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

Die Frage verwendet Linq zu XML –

Verwandte Themen