2010-12-21 10 views
41

Sé que es posible obtener cualquier nodo XML usando C# si conoce el nombre del nodo, pero quiero obtener el nodo raíz para poder encontrar el nombre. es posible?¿Cómo obtengo el nodo raíz XML con C#?

Actualización: Estoy usando XMLTextReader para leer en la URL de un archivo y luego cargar eso en el objeto XMLDocument. Básicamente estoy tratando de evitar LINQ a XML, pero si hay otra manera mejor, entonces siempre soy un buen estudiante.

+1

¿Cómo está usted recibiendo el documento XML? – Oded

+1

¿Qué está utilizando para analizar XML? –

Respuesta

68

nodo raíz es la propiedad de DocumentElementXmlDocument

XmlElement root = xmlDoc.DocumentElement 

Si sólo tiene el nodo, se puede obtener el nodo raíz por

XmlElement root = xmlNode.OwnerDocument.DocumentElement 
+0

Gracias. Intentaré eso. Además, si la raíz de XmlDocument es .DocumentElement significa que los elementos secundarios de root serán root.DocumentElement? –

+1

No, .DocumentElement es solo una propiedad de XmlDocument, mientras que los hijos de root son xmlNode, por lo que no tienen esta propiedad. Es por eso que usas .OwnerDocument para obtener la raíz. – CharlesB

+0

¡Respuesta increíble! No puedo agradecerles lo suficiente @CharlesB por salvarme! Ojalá pudiera votar esto varias veces. – async

20

Tengo la misma pregunta aquí. Si el documento es enorme, no es una buena idea usar XmlDocument. El hecho es que el primer elemento es el elemento raíz, basado en el cual se puede usar XmlReader para obtener el elemento raíz. Usar XmlReader será mucho más eficiente que usar XmlDocument ya que no requiere cargar todo el documento en la memoria.

using (XmlReader reader = XmlReader.Create(<your_xml_file>)) { 
    while (reader.Read()) { 
     // first element is the root element 
     if (reader.NodeType == XmlNodeType.Element) { 
     System.Console.WriteLine(reader.Name); 
     break; 
     } 
    } 
    } 
11

De acuerdo con Jewes, XmlReader es el mejor camino a seguir, sobre todo si se trabaja con un documento XML o mayor de proceso de múltiples en un bucle - no hay necesidad de analizar el documento completo si sólo se necesita la raíz del documento.

Aquí hay una versión simplificada, utilizando XmlReader y MoveToContent().

http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.movetocontent.aspx

using (XmlReader xmlReader = XmlReader.Create(p_fileName)) 
{ 
    if (xmlReader.MoveToContent() == XmlNodeType.Element) 
    rootNodeName = xmlReader.Name; 
} 
+0

Por favor, diga lo que significa si la instrucción 'if' falla. –

+0

Si nunca golpea, el contenido del archivo no tiene elementos. Se leerá hasta el final del archivo y rootNodeName no se establecerá. – WestDiscGolf

+0

Eso es correcto. Para ir más lejos, puede tener problemas al analizar el XML en primer lugar, porque no está bien formado o puede tener una declaración DTD (que por cierto puede deshabilitarse usando XmlReaderSettings - http://msdn.microsoft.com/ en-us/library/z2adhb2f (v = VS.100) .aspx) etc. por lo que probablemente deba ajustar todo el análisis sintáctico con un try-catch, por las dudas, pero ese sería un tema diferente en realidad, y sí, haga una prueba para un nombre de nodo raíz en blanco o nulo (método String.IsNullOrEmpty()). –

0

probar este

XElement root = XDocument.Load(fStream).Root; 
+2

Carga() devuelve vacío – Nick

+0

¿Eh? Devuelve 'XDocument'. 'public static XDocument Load (Stream stream);' -System.Xml.Linq.XDocument (System.Xml.Linq.dll) –

0
string rootNode = null; 
XmlDocument XmlDoc = new XmlDocument(); 
XmlDoc.Load(response.GetResponseStream()); 
rootNode = XmlDoc.ChildNodes(0).Name; 
+0

Esta pregunta no está relacionada con VB. – Bikku

+0

@GoodBadandUgly - Converted – nesomis

+0

@nesomis Gracias, su respuesta fue útil para mí. Nota secundaria: ChildNodes es una propiedad. – Sam

Cuestiones relacionadas