2010-06-03 16 views
11

pregunta simple pero he estado dinking durante una hora y realmente me está empezando a frustrar. Tengo XML que tiene este aspecto:Obtiene el contenido del nodo XML usando C#

<TimelineInfo> 
    <PreTrialEd>Not Started</PreTrialEd> 
    <Ambassador>Problem</Ambassador> 
    <PsychEval>Completed</PsychEval> 
    </TimelineInfo> 

Y todo lo que quiero hacer es usar C# para obtener la cadena almacenada entre <Ambassador> y </Ambassador>.

hasta ahora tengo:

XmlDocument doc = new XmlDocument(); 
doc.Load("C:\\test.xml"); 
XmlNode x = doc.SelectSingleNode("/TimelineInfo/Ambassador"); 

que selecciona la nota muy bien, ahora cómo en el mundo puedo obtener el contenido ahí dentro?

Respuesta

15

¿Puedo sugerir que eche un vistazo a LINQ-to-XML (System.Xml.Linq)?

var doc = XDocument.Load("C:\\test.xml"); 

string result = (string)doc.Root.Element("Ambassador"); 

LINQ-a-XML es mucho más agradable que el XML * clases (System.Xml).


lo contrario, debe ser capaz de obtener el valor del elemento mediante la recuperación de la propiedad InnerText.

string result = x.InnerText; 
+0

No debería ser necesario para echar a XmlElement - InnerText se define en el XmlNode padre como virtual y XmlElement simplemente lo reemplaza de forma normal. –

+1

BTW, en caso de que otros se encuentren con esto, el lanzamiento a la cadena es importante (XElement define muchas conversiones explícitas para que puedas hacer cosas como esta y no tengas que llamar a los métodos Convert), en cambio podrías estar tentada a ToString, pero eso no obtiene el mismo resultado (obtendría todo el elemento, incluidos la apertura, el cierre y el contenido) –

+0

BTW, ya que en este fragmento de ejemplo no estamos realmente utilizando el XDocument, una versión ligeramente más simple sería XElement.Load el archivo que obtiene el elemento raíz directamente. Sin embargo, eso es solo un punto de trivia: XDocument.Load es ciertamente lo que quieres usar en el caso típico. :) –

3
XmlDocument doc = new XmlDocument(); 
doc.Load("C:\\test.xml"); 
XmlNode x = doc.SelectSingleNode("/TimelineInfo/Ambassador"); 

x.InnerText devolverá los contenidos

+0

Simple y eficiente. Prestigio – Jay

4

La propiedad InnerText debería funcionar bien para usted.

http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.innertext.aspx

Fwiw, usted podría considerar el cambio a la API LINQ a XML (XElement y amigos) que en mi humilde opinión Es una API fácil de usar para interactuar con él.

versión System.XML (NOTA: no necesita de fundición a XmlElement)

var xml = @"<TimelineInfo> 
       <PreTrialEd>Not Started</PreTrialEd> 
       <Ambassador>Problem</Ambassador> 
       <PsychEval>Completed</PsychEval> 
      </TimelineInfo>"; 
XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xml); 
var node = doc.SelectSingleNode("/TimelineInfo/Ambassador"); 
Console.WriteLine(node.InnerText); 

-LINQ a xml version:

var xml = @"<TimelineInfo> 
       <PreTrialEd>Not Started</PreTrialEd> 
       <Ambassador>Problem</Ambassador> 
       <PsychEval>Completed</PsychEval> 
      </TimelineInfo>"; 
var root = XElement.Parse(xml); 
string ambassador = (string)root.Element("Ambassador"); 
Console.WriteLine(ambassador); 
Cuestiones relacionadas