2008-12-09 6 views
7

Je suis en train de rechercher plusieurs attributs XML:Trouvez par plusieurs attributs XML

<APIS> 
    <API Key="00001"> 
    <field Username="username1" UserPassword="password1" FileName="Filename1.xml"/> 
    <field Username="username2" UserPassword="password2" FileName="Filename2.xml"/> 
    <field Username="username3" UserPassword="password3" FileName="Filename3.xml"/> 
    </API> 
</APIS> 

Je dois vérifier si, dans le « champ » les valeurs nom d'utilisateur et UserPassword sont à la fois ce que je compare avec mon Valeurs de jeu de données, existe-t-il un moyen de vérifier plusieurs attributs (condition ET) sans écrire ma propre logique d'utilisation des drapeaux et de rupture des boucles.

Y at-il une fonction intégrée de XMLDoc qui le fait? Toute aide serait appréciée!

+0

Deux points. Premièrement, le XML ne semble pas valide. Deuxièmement, quel langage/environnement utilisez-vous? Par exemple, je sais comment faire cela en C# ... –

+0

Le XML invalide (
tags) était simplement parce qu'il ne savait pas comment formater quelque chose comme du code. Je l'ai corrigé. – Tomalak

Répondre

25

Pour rechercher ce que vous voulez dans l'extrait de XML que vous avez fourni, vous devez l'expression XPath suivante:

/APIS/API/field[@Username='username1' and @UserPassword='password1'] 

Ce serait soit retourner quelque chose, si le nom d'utilisateur et correspondance de mot de passe - ou pas si elles ne fais pas ça. De couse l'expression XPath est juste une chaîne - vous pouvez le construire dynamiquement avec des valeurs qui ont été entrées dans un champ de formulaire, par exemple.

Si vous indiquez la langue/l'environnement dans lequel vous vous trouvez, les exemples de code postés ici seront probablement plus spécifiques.

C'est une façon de le faire en C# (VB.NET est analogue):

// make sure the following line is included in your class 
using System.Xml; 

XmlDocument xmldoc = new XmlDocument(); 
xmldoc.Load("your XML string or file"); 

string xpath = "/APIS/API/field[@Username='{0}' and @UserPassword='{1}']"; 
string username = "username1"; 
string password = "password1"; 

xpath = String.Format(xpath, username, password); 
XmlNode userNode = xmldoc.SelectSingleNode(xpath); 

if (userNode != null) 
{ 
    // found something with given user name and password 
} 
else 
{ 
    // username or password incorrect 
} 

Sachez que ni les noms d'utilisateur, ni les mots de passe peuvent contenir des guillemets simples, ou l'exemple ci-dessus échouera. Voici some info on this peculiarity.

Il y a aussi un How-To de Microsoft disponible: HOW TO: Use the System.Xml.XmlDocument Class to Execute XPath Queries in Visual C# .NET

2

La recherche XML est ce que XPath a été conçu. Vous n'avez pas spécifié la langue que vous utilisez, mais here's an article sur le traitement XML à l'aide de XPath en Java et here's one en utilisant C#.

1

C'est une FAQ sur XPath expressions.

Une ou plusieurs expressions XPath (dont le type évalué est booléen) peuvent être connectées ensemble en utilisant les touches boolean operators "et" et "ou" et en utilisant la fonction XPath not().

Notez que les noms de ceux-ci sont tous en minuscules. XPath est sensible à la casse et toute autre majuscule de ces noms (comme "AND") ne sera pas reconnue comme le nom des opérateurs logiques.

Ainsi, dans ce cas particulier, l'expression recherchée XPath sera quelque chose comme ce qui suit:

/*/*/field[@Username = your-ds-username and @UserPassword = your-ds-UserPassword]

your-ds-username et your-ds-UserPassword devraient être remplacées par les valeurs respectives que vous souhaitez utiliser à partir de la jeu de données.

+0

Pourquoi utiliser "/ */*" (par opposition à "//")? J'ai pensé - quand vous n'êtes pas spécifique au sujet des noms d'éléments, vous pourriez tout aussi bien ne pas être précis sur la profondeur de nidification. Ou est-ce que j'oublie quelque chose? – Tomalak

+0

@Tomalak: Évitez l'abréviation "//" car cela entraîne la recherche dans l'arborescence complète du document. Lorsque nous connaissons la structure du document, nous ne pouvons spécifier que les niveaux et les noms nécessaires. Dans ce cas, les noms sont le seul nom apparaissant à un niveau, il est donc plus efficace de ne pas chercher un nom –

0

Pour rechercher plusieurs attributs en cas de balise XML, nous pouvons utiliser la XPATH suivante /APIS/API/champ [@ Nom d'utilisateur = 'username1'] [@ UserPassword = 'password1']

Questions connexes