Поиск по множеству атрибутов в XML

Я пытаюсь выполнить поиск по нескольким атрибутам в 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 не выглядит корректным. Во-вторых, какой язык / среду вы используете? Например, я знаю, как это сделать на C# ...

Jason Jackson 09.12.2008 22:07

Недопустимый XML (теги <br>) произошел просто потому, что он не знал, как что-то отформатировать в виде кода. Я поправил.

Tomalak 09.12.2008 22:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
2
35 418
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Поиск в 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 10.12.2008 13:02

@Tomalak: Избегайте сокращения "//", поскольку оно вызывает поиск по всему дереву документа. Зная структуру документа, мы можем указать только необходимые уровни и имена. В этом случае имена являются единственными именами, встречающимися на уровне, поэтому более эффективно не проверять имя

Dimitre Novatchev 11.12.2008 05:57

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

Другие вопросы по теме