Найти через несколько атрибутов в XML - PullRequest
8 голосов
/ 09 декабря 2008

Я пытаюсь найти несколько атрибутов в 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>

Мне нужно проверить, совпадают ли значения «Имя пользователя» и «Пароль пользователя» в «поле» с тем, что я сравниваю со значениями моего набора данных, есть ли способ проверить несколько атрибутов (условие «И») без написания собственной логики использования? Флаги и вылеты из петель.

Есть ли встроенная функция XMLDoc, которая это делает? Любая помощь будет оценена!

Ответы [ 4 ]

26 голосов
/ 09 декабря 2008

Для поиска того, что вы хотите в предоставленном вами фрагменте XML, вам понадобится следующее выражение XPath:

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

Это либо возвращает что-то, если имя пользователя и пароль совпадают, либо нет, если они не совпадают.

Конечно, выражение XPath - это просто строка - вы можете построить ее динамически, например, со значениями, введенными в поле формы.

Если вы скажете, на каком языке / в какой среде вы находитесь, примеры кода, размещенные здесь, скорее всего, станут более конкретными.

Это способ сделать это в C # (VB.NET аналогичен):

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

Помните, что ни имена пользователей, ни пароли не могут содержать одинарные кавычки, иначе приведенный выше пример не удастся. Вот некоторая информация об этой особенности .

Существует также инструкция от Microsoft: КАК: использовать класс System.Xml.XmlDocument для выполнения запросов XPath в Visual C # .NET

2 голосов
/ 09 декабря 2008

Поиск по XML - это то, для чего был создан XPath . Вы не указали, какой язык вы используете, но вот статья по обработке XML с использованием XPath в Java, а вот одна с использованием C #.

1 голос
/ 10 декабря 2008

Это часто задаваемые вопросы о XPath выражениях .

Одно или несколько выражений XPath (чей оцененный тип является логическим) могут быть связаны вместе с помощью логических операторов "и" и "или" и с использованием функции XPath нет () .

Обратите внимание, что все они в нижнем регистре . XPath чувствителен к регистру, и любая другая заглавная буква этих имен (например, «И») не будет распознаваться как имя логических операторов.

Итак, в данном конкретном случае требуемое выражение XPath будет выглядеть примерно так:

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

, где your-ds-username и your-ds-UserPassword должны быть заменены соответствующими значениями, которые вы хотите использовать из набора данных.

0 голосов
/ 04 ноября 2014

Для поиска нескольких атрибутов в случае тега XML мы можем использовать следующий XPATH / APIS / API / field [@ Username = 'username1'] [@ UserPassword = 'password1']

...