2009-09-18 41 views
7

tengo el siguiente documento XML:Extraer un elemento XML desde un archivo XML usando XPath

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

Todo el documento contiene alrededor de 700 entradas. ¿Cómo puedo extraer un solo elemento MimeType usando XPath y rellenarlo en un objeto fuertemente tipado C# MimeType?

+2

¿Estás obligado a no usar .NET 3.5? Si puede usar .NET 3.5, usaría XDocument y Linq para Xml; lo encontrará más simple que XPath. –

+0

No necesariamente. Es mejor usar una combinación de ambos: http://stackoverflow.com/questions/1294386/is-there-an-xpath-equivilent-for-linq-to-xml – Ryall

+0

yes forzado en una esquina .net 2. –

Respuesta

13

Uso XmlDocument.SelectSingleNode.

Ejemplo:

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

A continuación, puede acceder node.ChildNodes el fin de obtener los valores que desee (ejemplo):

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

y luego usar esos valores en la construcción de su objeto MimeType.

Editar: Algunos XPath información.
Hay algunos tutoriales de XPath realmente buenos, intente here y . El W3C recommendation en sí mismo puede ser un poco abrumador.
Para su ejemplo, se podría tratar de usar la siguiente XPath para seleccionar la primera MimeType nodo en el documento (donde es root cualquiera que sea el nombre de su elemento raíz):

string xPath = "root/MimeType[1]" 

Espero que ayude!

+0

¡El fragmento de Donut lo resume todo! Es apenas más difícil que eso. Es posible que desee comprobar mi respuesta a la publicación SO en http://stackoverflow.com/questions/1440184/how-to-display-value-in-log-file-from-an-xml-file/1440642 para obtener un fragmento más largo indicativo de condiciones de error, lo que se devuelve cuando no se encuentra, etc. – mjv

+0

ok Voy a intentarlo ... ¿hay alguna posibilidad de obtener un ejemplo de XPath? ¿Siento ser descarado? –

+0

Sí, agregué un poco de información XPath (enlaces + ejemplo simple) a mi respuesta, espero que ayude. – Donut

2

El siguiente método debe proporcionar un marco para conseguir el tipo MIME aquí

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

El truco es encontrar el tipo MIME basado en el texto de la extensión, a continuación, recuperar el antepasado de MimeType para este partido.

1

seguimiento a the answer by @MiffTheFox, puede utilizar XPath junto con LINQ to XML. Aquí hay un ejemplo basado en sus datos de muestra.

1) En primer lugar, los espacios de nombres que necesitará:

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

2) cargar el documento XML en un XElement:

XElement rootElement = XElement.Parse(xml); 

3) Define tu XPath ruta de ubicación:

// 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) pase la ruta ubicación para XPathSelectElement() para seleccionar el elemento de interés:

XElement selectedElement = rootElement.XPathSelectElement(locationPath); 

5) último, extraer el valor MimeType que se asocia con la extensión:

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