2009-09-18 6 views
7

Ich habe das folgende XML-Dokument:Extrahieren ein XML-Element aus einer XML-Datei mithilfe von XPath

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

Das gesamte Dokument enthält ca. 700 Einträge. Wie kann ich ein einzelnes MimeType Element mit XPath extrahieren und in ein stark typisiertes C# MimeType Objekt füllen?

+2

Sind Sie gezwungen, .NET 3.5 nicht zu benutzen? Wenn Sie .NET 3.5 verwenden können, würde ich XDocument und Linq zu Xml verwenden, Sie finden es einfacher als XPath. –

+0

Nicht unbedingt. Es ist besser, eine Kombination aus beiden zu verwenden: http://stackoverflow.com/questions/1294386/is-there-an-xpath-equivilent-for-linq-to-xml – Ryall

+0

ja in eine .net 2 Ecke gezwungen. –

Antwort

13

Verwendung XmlDocument.SelectSingleNode.

Beispiel:

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

Dann können Sie node.ChildNodes zugreifen, um die Werte, die Sie wollen (Beispiel):

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

Und dann diese Werte verwenden, wenn die Mimetype-Objekt zu konstruieren.

Bearbeiten: Einige XPath-Informationen.
Es gibt einige wirklich gute XPath-Tutorials, probieren Sie here und . Die W3C recommendation selbst kann ein bisschen überwältigend sein.
Für Ihr Beispiel, könnten Sie versuchen, die folgende XPath mit den ersten MimeType Knoten in dem Dokument zu wählen (wobei root ist was der Name Ihres Root-Elements):

string xPath = "root/MimeType[1]" 

Hoffnung, das hilft! für dieses Spiel

+0

Donuts Schnipsel fasst alles zusammen! Es ist kaum schwieriger als das. Vielleicht möchtest du meine Antwort auf die SO-Veröffentlichung unter http://stackoverflow.com/questions/1440184/how-to-display-value-in-log-file-from-an-xml-file/1440642 nachsehen längeres Snippet, das auf Fehlerbedingungen hinweist, was zurückgegeben wird, wenn es nicht gefunden wird usw. – mjv

+0

ok Ich werde es versuchen ... eine Chance, ein XPath-Beispiel zu bekommen? Tut mir leid, frech zu sein? –

+0

Ja, ich habe einige XPath-Informationen (Links + einfaches Beispiel) zu meiner Antwort hinzugefügt - hoffe, es hilft. – Donut

2

Das folgende Verfahren sollte einen Rahmen für das Erhalten Typ bieten die MIME hier

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

Der Trick ist, die Mimetype auf den Text in der Verlängerung auf Basis zu finden, die dann den Vorfahren des Mimetype abzurufen.

1

auf the answer by @MiffTheFox Nach oben können Sie XPath zusammen mit LINQ to XML verwenden. Hier ist ein Beispiel basierend auf Ihren Beispieldaten.

1) Zunächst werden die Namensräume benötigen Sie:

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

2) Legen Sie das XML-Dokument in ein XElement:

XElement rootElement = XElement.Parse(xml); 

3) Definieren Sie Ihre XPath Standortpfad:

// 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 die Lage Pfad zu XPathSelectElement() das Element von Interesse zu wählen:

XElement selectedElement = rootElement.XPathSelectElement(locationPath); 

5) schließlich den Mimetypen Wert extrahiert, die mit der Erweiterung verbunden ist:

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