Я пытаюсь выполнить поиск по нескольким атрибутам в 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>
Мне нужно проверить, соответствуют ли значения Username и UserPassword в «поле» значениям, которые я сравниваю с моими значениями набора данных, есть ли способ, при котором я могу проверить несколько атрибутов (условие И) без написания собственной логики использования флагов и взлома из петель.
Есть ли встроенная функция XMLDoc, которая это делает? Любая помощь будет оценена по достоинству!
Недопустимый XML (теги <br>) произошел просто потому, что он не знал, как что-то отформатировать в виде кода. Я поправил.





Поиск в XML - это то, для чего был создан XPath. Вы не указали, какой язык вы используете, но вот статья при обработке XML с использованием XPath в Java и вот один с использованием C#.
Чтобы найти то, что вы хотите, в предоставленном вами фрагменте 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
Это часто задаваемые вопросы о выражениях XPath..
Одно или несколько выражений XPath (оцениваемый тип которых является логическим) могут быть соединены вместе с помощью логические операторы "и" и "или" и с помощью функции XPath нет().
Обратите внимание, что все имена в нижнем регистре. XPath чувствителен к регистру, и любые другие заглавные буквы в этих именах (например, «И») не будут распознаваться как имена логических операторов.
Итак, в этом конкретном случае желаемое выражение XPath будет примерно таким:
/*/*/field[@Username = your-ds-username and @UserPassword = your-ds-UserPassword]
где your-ds-username и your-ds-UserPassword следует заменить соответствующими значениями, которые вы хотите использовать из набора данных.
Почему используется «/ * / *» (а не «//»)? Я подумал - когда вы не уточняете имена элементов, вы также можете не уточнять глубину вложенности. Или я что-то упускаю?
@Tomalak: Избегайте сокращения "//", поскольку оно вызывает поиск по всему дереву документа. Зная структуру документа, мы можем указать только необходимые уровни и имена. В этом случае имена являются единственными именами, встречающимися на уровне, поэтому более эффективно не проверять имя
Для поиска нескольких атрибутов в случае тега XML мы можем использовать следующий XPATH / APIS / API / field [@ Username = 'username1'] [@ UserPassword = 'password1']
Два очка. Во-первых, XML не выглядит корректным. Во-вторых, какой язык / среду вы используете? Например, я знаю, как это сделать на C# ...