2009-06-24 8 views
23

J'ai un document XML comme suit:C# LINQ pour vérifier XML si l'élément 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> 

Je suis en train de vérifier si le nœud enfant numéro du noeud SMS parent existe dans le document (à des fins de validation éviter d'insérer des données en double).

Des conseils sur une solution potentielle?

EDIT: L'élément sera comparé à une chaîne d'entrée. Par exemple si (inputNumber == xmlDocNumber) {// Ne pas insérer un nouvel élément}

+0

Pourriez-vous nous donner un exemple de code (pseudo?) Pour fournir un contexte et une image plus claire de vos besoins> –

+0

Aucun de ces travaux grr! – Goober

+1

comment un exemple de code aiderait .......... trouver un élément spécifié dans un document xml ....... que puis-je vous donner en plus de ce que j'ai? – Goober

Répondre

41

Je vais suggérer un point légèrement différent à utiliser Count() - utiliser Any(). L'avantage est que tout() peut arrêter dès qu'il obtient des matchs du tout:

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

Dans ce cas, il ne fera pas beaucoup chance, mais dans les cas où Count() pourrait devoir compter un million de visites seulement pour vous dire qu'il y en avait au moins un, c'est un truc utile à savoir. Je dirais que c'est aussi un indicateur plus clair de ce que vous voulez dire.

+0

Comment l'utiliser pour vérifier? Désolé, je suis encore en train de me familiariser avec LINQ – Blackator

+0

@Blackator: La partie 'Any' est en train de * faire * la vérification. Je ne sais pas à quel problème vous êtes confronté, il est donc difficile d'être plus précis. Peut-être que vous devriez poser une nouvelle question? –

+0

S'il vous plaît vérifier ma question [ici] (http://stackoverflow.com/questions/12276533/check-if-an-element-exists-in-xml). Merci Jon – Blackator

0

Vous pouvez appliquer un document XSL qui traduit les données en boucle à travers les nœuds SMS et l'exclusion de tout qui a un double numéro/texte() Valeur

Vérifiez serait quelque chose comme:

<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 question utilise Linq au XML # –

1

en supposant que vous avez votre numéro sous une forme canonisé et votre XML est chargé dans un XmlDocument ou d'une telle, la façon la plus simple non LINQ de le faire est avec une requête XPath:

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

La question utilise Linq à XML –

Questions connexes