2008-12-09 22 views
7

que estoy tratando de buscar múltiples atributos en XML:a través de múltiples atributos en 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> 

tengo que comprobar si en el "campo" los valores de nombre de usuario y USERPASSWORD son a la vez lo estoy comparando con mi Los valores del conjunto de datos, ¿hay alguna manera en que pueda verificar múltiples atributos (condición Y) sin escribir mi propia lógica de usar banderas y romper bucles?

¿Existe una función incorporada de XMLDoc que lo hace? ¡Cualquier ayuda sería apreciada!

+0

dos puntos. Primero, el XML no parece válido. En segundo lugar, ¿qué idioma/entorno estás usando? Por ejemplo, sé cómo hacer esto en C# ... –

+0

El XML no válido (etiquetas
) era simplemente porque no sabía cómo formatear algo como código. Lo he corregido – Tomalak

Respuesta

25

Para buscar lo que quieres en el fragmento de XML que ya ha proporcionado, se necesitaría la siguiente expresión XPath:

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

Esto sería ya sea devolver algo, si el nombre de usuario y combinar contraseña - o no si no lo hagas

Por supuesto, la expresión XPath es solo una cadena; puede compilarla dinámicamente con los valores que se ingresaron en un campo de formulario, por ejemplo.

Si dices en qué idioma o entorno te encuentras, es probable que los ejemplos de código publicados aquí sean más específicos.

Esta es una manera de hacerlo en C# (VB.NET es análogo):

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

Tenga en cuenta que ni los nombres de usuario ni contraseñas pueden contener comillas simples, o el ejemplo anterior se producirá un error. Aquí está some info on this peculiarity.

También hay un How-To de Microsoft disponibles: HOW TO: Use the System.Xml.XmlDocument Class to Execute XPath Queries in Visual C# .NET

2

Buscando en XML es por lo que XPath se hizo para. No especificó qué idioma está usando, pero here's an article al procesar XML usando XPath en Java y here's one usando C#.

1

Este es un FAQ sobre XPath expresiones.

Una o más expresiones XPath (cuyo tipo evaluado es booleano), pueden conectarse juntas usando boolean operators "y" y "o" y usando la función XPath not().

Tenga en cuenta que los nombres de estos son todos en minúsculas. XPath distingue entre mayúsculas y minúsculas y cualquier otra mayúscula de estos nombres (como "Y") no se reconocerá como el nombre de los operadores lógicos.

Por lo tanto, en este caso particular, la expresión XPath deseada será algo como lo siguiente:

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

donde your-ds-username y your-ds-UserPassword deberían ser sustituidos por los respectivos valores que desea utilizar de la conjunto de datos.

+0

¿Por qué usar "/ */*" (en lugar de "//")? Pensé que, cuando no tengas en cuenta los nombres de los elementos, podrías ser poco específico sobre la profundidad de anidación. ¿O pasé por alto algo? – Tomalak

+0

@Tomalak: evite la abreviatura "//" ya que hace que se busque el árbol de documentos completo. Cuando conocemos la estructura del documento, podemos especificar solo los niveles y nombres necesarios. En este caso, los nombres son el único nombre que aparece en un nivel, por lo que es más eficiente no buscar un nombre –

0

Para buscar varios atributos en el caso de la etiqueta XML, podemos usar el siguiente XPATH /API/API/campo [@ nombre de usuario = 'usuario1'] [@ UserPassword = 'contraseña1']

Cuestiones relacionadas