2009-09-18 21 views
7

Ho la seguente documento XML:Estrazione un elemento XML da un file XML utilizzando XPath

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

L'intero documento contiene circa 700 voci. Come posso estrarre un singolo elemento MimeType utilizzando XPath e inserirlo in un oggetto C# MimeType fortemente tipizzato?

+2

Sei costretto a non utilizzare .NET 3.5? Se è possibile utilizzare .NET 3.5, utilizzerei XDocument e Linq per Xml lo troverete più semplice di XPath. –

+0

Non necessariamente. È preferibile utilizzare una combinazione di entrambi: http://stackoverflow.com/questions/1294386/is-there-an-xpath-equivilent-for-linq-to-xml – Ryall

+0

yes forzato in un angolo .net 2. –

risposta

13

Usa XmlDocument.SelectSingleNode.

Esempio:

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

Poi si può accedere node.ChildNodes al fine di ottenere i valori desiderati (esempio):

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

E poi utilizzare tali valori quando si costruisce l'oggetto MimeType.

Modifica: alcune informazioni XPath.
Ci sono alcuni tutorial XPath davvero buoni là fuori, prova here e here. Lo stesso W3C recommendation può essere un po 'opprimente.
Per esempio, si potrebbe provare a utilizzare il seguente XPath per selezionare il primo nodo MimeType nel documento (dove root è qualunque sia il nome del vostro elemento root):

string xPath = "root/MimeType[1]" 

Speranza che aiuta!

+0

Lo snippet di Donut riassume tutto! Non è più difficile di così. Puoi controllare la mia risposta al post SO su http://stackoverflow.com/questions/1440184/how-to-display-value-in-log-file-from-an-xml-file/1440642 per un frammento più lungo indicativo di condizioni di errore, cosa viene restituito quando non viene trovato ecc. – mjv

+0

ok Darò questo a ... qualche possibilità di ottenere un esempio XPath? Mi spiace essere sfacciato? –

+0

Sì, ho aggiunto alcune informazioni XPath (link + esempio semplice) alla mia risposta - spero che aiuti. – Donut

2

Il seguente metodo dovrebbe fornire un quadro di riferimento per ottenere il MIME Type qui

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

Il trucco è quello di trovare il tipo MIME in base al testo nel prolungamento, quindi recuperare l'antenato di MimeType per questa partita.

1

Facendo seguito a the answer by @MiffTheFox, è possibile utilizzare XPath insieme LINQ to XML. Ecco un esempio basato sui tuoi dati di esempio.

1) In primo luogo, gli spazi dei nomi che vi serve:

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

2) Caricare il documento XML in un XElement:

XElement rootElement = XElement.Parse(xml); 

3) Definisci il tuo XPath percorso di posizione:

// 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) passare il percorso posizione per XPathSelectElement() per selezionare l'elemento di interesse:

XElement selectedElement = rootElement.XPathSelectElement(locationPath); 

5) Infine, estrarre il valore MimeType che è associato con l'estensione:

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