2009-09-18 19 views
7

Mam następujący dokument XML:Wyodrębnianie element XML z pliku XML za pomocą XPath

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

Cały dokument zawiera około 700 pozycji. Jak wyodrębnić pojedynczy element MimeType przy użyciu XPath i wprowadzić go do mocno wpisanego obiektu C# MimeType?

+2

Czy jesteś zmuszony nie używać .NET 3.5? Jeśli możesz korzystać z .NET 3.5, użyłbym XDocument i Linq do Xml, okaże się to prostsze niż XPath. –

+0

Niekoniecznie. Lepiej jest użyć kombinacji obu: http://stackoverflow.com/questions/1294386/is-there-an-xpath-equivilent-for-linq-to-xml – Ryall

+0

yes wymuszone na rogu .net 2. –

Odpowiedz

13

Zastosowanie XmlDocument.SelectSingleNode.

Przykład:

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

Następnie można przejść node.ChildNodes aby uzyskać żądane wartości (przykład):

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

a następnie wykorzystać te wartości przy konstruowaniu swój obiekt MimeType.

Edytuj: Niektóre informacje XPath.
Istnieje kilka naprawdę dobrych samouczków XPath, spróbuj here i here. Sam model W3C recommendation może być nieco przytłaczający.
Dla przykładu, można wypróbować następujące XPath, aby wybrać pierwszą MimeType węzeł w dokumencie (gdzie root jest cokolwiek nazwa elementu głównego):

string xPath = "root/MimeType[1]" 

nadzieję, że pomoże!

+0

Fragment Doughnut wszystko to podsumowuje! To nie jest trudniejsze. Możesz sprawdzić moją odpowiedź na ogłoszenie SO na http://stackoverflow.com/questions/1440184/how-to-display-value-in-log-file-from-an-xml-file/1440642 dla dłuższy fragment wskazujący na warunki błędu, co jest zwracane, gdy nie zostanie znaleziony itp. – mjv

+0

ok Daję to odejść ... jakąkolwiek szansę uzyskania przykładu XPath? Przepraszam za bezczelność? –

+0

Tak, dodałem trochę informacji XPath (linki + prosty przykład) do mojej odpowiedzi - mam nadzieję, że to pomaga. – Donut

2

Poniższa metoda powinna stanowić ramy dla coraz MIME Wpisz tutaj

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 ... 
} 

Sztuką jest znalezienie MimeType oparte na tekście w rozszerzeniu, a następnie pobierać przodka mimeType dla tego meczu.

1

Nawiązując do the answer by @MiffTheFox, można użyć XPath wraz z LINQ do XML. Oto przykład oparty na Twoich przykładowych danych.

1) Po pierwsze, trzeba nazw:

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

2) Załaduj dokument XML do XElement:

XElement rootElement = XElement.Parse(xml); 

3) Zdefiniuj XPath Ścieżka lokalizacji:

// 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) podając ścieżkę lokalizacji do XPathSelectElement() wybór elementu zainteresowania:

XElement selectedElement = rootElement.XPathSelectElement(locationPath); 

5) Ostatecznie, ekstrakt wartość MimeType, który jest związany z rozszerzeniem:

var mimeType = (string)selectedElement.Element("Value");