2009-09-18 13 views
7

У меня есть следующий XML-документ:Извлечение элемента XML из файла XML с помощью XPath

<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?

+2

Вы вынуждены не использовать .NET 3.5? Если вы можете использовать .NET 3.5, я бы использовал XDocument и Linq для Xml, вы найдете это проще, чем XPath. –

+0

Не обязательно. Лучше использовать комбинацию обоих: http://stackoverflow.com/questions/1294386/is-there-an-xpath-equivilent-for-linq-to-xml – Ryall

+0

да принудительно в угол .net 2. –

ответ

13

Использование 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, попробуйте here и here. Сам W3C recommendation может быть немного подавляющим.
Для примера, вы можете попробовать использовать следующий XPath, чтобы выбрать первый MimeType узел в документе (где root является то, что имя корневого элемента):

string xPath = "root/MimeType[1]" 

Надежда, что помогает!

+0

Фрагмент Donut суммирует все это! Это вряд ли сложнее. Вы можете проверить мой ответ на публикацию SO по адресу http://stackoverflow.com/questions/1440184/how-to-display-value-in-log-file-from-an-xml-file/1440642 для более длинный отрывок, указывающий на условия ошибки, то, что возвращается, когда не найдено и т. д. – mjv

+0

ok Я дам это ... любой шанс получить пример XPath? Извините, что нахальный? –

+0

Да, добавили некоторые ответы XPath (ссылки + простой пример) на мой ответ - надеюсь, что это поможет. – Donut

2

Следующий метод должен служить основой для получения 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

Вслед за the answer by @MiffTheFox, вы можете использовать XPath вместе с LINQ к 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) Pass пути доступа к XPathSelectElement(), чтобы выбрать элемент интереса:

XElement selectedElement = rootElement.XPathSelectElement(locationPath); 

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

var mimeType = (string)selectedElement.Element("Value"); 
Смежные вопросы