Хобрук: Ваш путь к мастерству в программировании

Выберите узел XML на основе значения родственного узла

У меня есть программа VB.NET 2013, которая читает/записывает в XML-документ, и я пытаюсь выяснить, как получить доступ к определенному узлу, когда я знаю текст одного из братьев и сестер узла. Я видел другие сообщения, которые похожи на то, что я пытаюсь сделать, но моя структура xml немного отличается, и я не знаю, как применить эти решения к моему документу.

Вот пример моей структуры xml:

<?xml version="1.0" encoding="utf-8"?>
<Books>
  <Book>
    <Title>Hansel and Gretel</Title>
    <Pages>221</Pages>
    <Price>3.5</Price>
    <Author>Grimm</Author>
  </Book>
  <Book>
    <Title>Green Eggs and Ham</Title>
    <Pages>145</Pages>
    <Price>5.25</Price>
    <Author>Dr. Seuss</Author>
  </Book>
</Books>

Примеры, которые я видел в других сообщениях, имеют значения в имени узла <Title title="Green Eggs and Ham">. Как видите, у меня нет.

Я не могу понять, как использовать XPath, XPathNavigator и т. д. для моего XML-документа, чтобы найти цену, например, если я знаю название.

Я вижу много примеров, которые выглядят так: /Books/Book[@Title="Green Eggs and Ham"], и я пытался использовать это с XPathNavigator.SelectSingleNode(), но я не могу понять правильный синтаксис VB.Net/XPath для использования с моим форматом xml.

ОБНОВЛЕНИЕ (Пример ответа) Поскольку я использую это в проекте VB.NET, мне нужно было знать, как использовать примеры, которые дали Богдан и ThW. Используя мой пример XML, я сделал это, чтобы получить количество страниц для заголовка «Гензель и Гретель»:

Dim xpathDoc As XPathDocument = New XPathDocument([path_to_xml)
Dim xmlNav as XPathNavigator = xpathDoc.CreateNavigator()
Dim pages as String

pages = xmlNav.SelectSingleNode("/Books/Book[Title='Hansel and Gretel']/Pages").Value

Что, разумеется, возвращает "221"

19.03.2015

Ответы:


1

@ в XPath — это ярлык для attribute::. Он выбирает узлы атрибутов (или более конкретные узлы на оси атрибутов).

Ваш узел Title является узлом элемента. Это дочерний элемент узла Book. child — это ось по умолчанию, поэтому она необязательна. В основном /Books/Book это сокращение от /child::Books/child::Book.

Часть в [] является условием для узлов. [@Title="Green Eggs and Ham"] фильтрует узел по атрибуту Title с заданным значением.

Чтобы найти узел дочернего элемента Title, удалите файл @.

/Books/Book[Title="Green Eggs and Ham"]

19.03.2015
  • Отличное подробное объяснение, ThW. Спасибо! Как мне использовать это в коде VB.NET? 19.03.2015

  • 2
    //Book/Title[text()='Green Eggs and Ham']/../Price
    

    text() ищет значение. .. выбирает родительский элемент

    ИЗМЕНИТЬ

    Спасибо ThW за объяснение по поводу ., удаленного из ответа.

    19.03.2015
  • text() выбирает текстовые дочерние узлы, . текущий узел. Итак, text() сравнивает каждый текстовый дочерний узел со строкой, . сравнивает текстовое содержимое текущего узла. 19.03.2015
  • Спасибо за ответ, Богдан, но не могли бы вы поместить этот код в контекст примера строки VB.NET? Как мне использовать это в коде VB.NET? 19.03.2015
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

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

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..