Извлечение элемента XML из файла XML с использованием XPath - PullRequest
7 голосов
/ 18 сентября 2009

У меня есть следующий XML-документ:

  <MimeType>
     <Extension>.aab</Extension>
     <Value>application/x-authorware-</Value>
  </MimeType>
  <MimeType>
     <Extension>.aam</Extension>
     <Value>application/x-authorware-</Value>
  </MimeType>

Весь документ содержит около 700 записей. Как я могу извлечь один MimeType элемент, используя XPath и заполнить его в строго типизированный объект C # MimeType?

Ответы [ 4 ]

14 голосов
/ 18 сентября 2009

Использование XmlDocument.SelectSingleNode.

Пример:

XmlDocument doc = new XmlDocument();
doc.Load("yourXmlFileName");
XmlNode node = doc.SelectSingleNode("yourXpath");

Затем вы можете получить доступ к node.ChildNodes, чтобы получить нужные значения (пример):

string extension = node.ChildNodes[0].InnerText;
string value = node.ChildNodes[1].InnerText;

А затем используйте эти значения при создании объекта MimeType.

Редактировать: Некоторая информация о XPath.
Есть несколько действительно хороших учебников по XPath, попробуйте здесь и здесь . Сама рекомендация W3C может быть немного ошеломляющей.
Для вашего примера вы можете попробовать использовать следующий XPath для выбора первого MimeType узла в документе (где root - это имя вашего корневого элемента):

string xPath = "root/MimeType[1]"

Надеюсь, это поможет!

2 голосов
/ 18 сентября 2009

Следующий метод должен обеспечить основу для получения MIME-типа здесь

public MimeType RunXPath(string mimeType)
{
  XmlNode node = _xmlDoc.SelectSingleNode(
    string.Format("//MimeType/Extension[text()="{0}"]/ancestor::MimeType", mimeType));
  foreach(XmlNode node in nodes)
  {
    // Extract the relevant nodes and populate the Mime Type here...
  }

  return ...
}

Хитрость заключается в том, чтобы найти MimeType на основе текста в расширении, а затем извлечь предка MimeType для этого совпадения.

1 голос
/ 16 июля 2014

В ответ на ответ @ MiffTheFox вы можете использовать XPath вместе с LINQ to XML . Вот пример, основанный на ваших данных образца.

1) Сначала вам понадобятся пространства имен:

using System.Linq;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;

2) Загрузите ваш XML-документ в XElement:

XElement rootElement = XElement.Parse(xml);

3) Определите путь к местоположению XPath:

// For example, to locate the 'MimeType' element whose 'Extension'
// child element has the value '.aam':
//
//     ./MimeType[Extension='.aam']

string extension = ".aam";
string locationPath = String.Format("./MimeType[Extension='{0}']", extension);

4) Передайте путь к XPathSelectElement(), чтобы выбрать интересующий элемент:

XElement selectedElement = rootElement.XPathSelectElement(locationPath);

5) Наконец, извлеките значение MimeType, связанное с расширением:

var mimeType = (string)selectedElement.Element("Value");
1 голос
/ 18 сентября 2009

Вы используете классы в пространстве имен System.Xml.XPath .

Учебники от MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...