2012-01-17 18 views
7

tengo XML String:¿Cómo puedo leer los elementos específicos de la cadena XML utilizando XMLReader en C#

<GroupBy Collapse=\"TRUE\" GroupLimit=\"30\"> 
     <FieldRef Name=\"Department\" /> 
    </GroupBy> 
    <OrderBy> 
     <FieldRef Name=\"Width\" /> 
    </OrderBy> 

Soy nuevo en C#. Traté de leer el atributo Nombre del elemento FieldRef para ambos elementos pero no pude. Usé XMLElement, ¿hay alguna manera de elegir estos dos valores?

+1

¿Qué código han intentado? –

+4

¿Cuál es el resto del XML? El XML válido debe tener un nodo raíz. – wsanville

Respuesta

9

A pesar de la publicación de XML válido (no nodo raíz), una forma fácil para iterar a través de los <FieldRef> elementos es utilizar el XmlReader.ReadToFollowing método:

//Keep reading until there are no more FieldRef elements 
while (reader.ReadToFollowing("FieldRef")) 
{ 
    //Extract the value of the Name attribute 
    string value = reader.GetAttribute("Name"); 
} 

Por supuesto una interfaz más flexible y fluida es proporcionado por LINQ a XML, ¿tal vez sería más fácil usarlo si estuviera disponible dentro del marco .NET al que se dirige? El código se convierte entonces en:

using System.Xml.Linq; 

//Reference to your document 
XDocument doc = {document}; 

/*The collection will contain the attribute values (will only work if the elements 
are descendants and are not direct children of the root element*/ 
IEnumerable<string> names = doc.Root.Descendants("FieldRef").Select(e => e.Attribute("Name").Value); 
+0

el problema es que esta cadena no es fija, algunas veces no contendrá el elemento GroupBy, algunas veces contendrá el elemento OrderBy. Necesito elegir FieldRef y debería saber a qué elemento raíz pertenece. – Waleed

+0

Observé que el elemento FieldRef no siempre está dentro del mismo nodo padre, los descendientes lo tendrán en cuenta y lo extraerán independientemente del elemento en el que esté anidado. Si también desea obtener el elemento padre utilizando LINQ a XML, intente esto: 'IEnumerable > pairings = doc.Root.Descendants (" FieldRef "). Seleccione (e => nuevo KeyValuePair (e.Parent, e.Attribute ("Name"). Value)); ' –

+0

Tengo una cadena, no un archivo, ¿cómo definiré el doc varaible? como veo su tipo de XDocument, ¿cómo puedo vincular mi cadena al documento? – Waleed

-1

probar esto:

string xml = "<GroupBy Collapse=\"TRUE\" GroupLimit=\"30\"><FieldRef Name=\"Department\" /></GroupBy><OrderBy> <FieldRef Name=\"Width\" /></OrderBy>"; 
    xml = "<root>" + xml + "</root>"; 
    XmlDocument doc = new XmlDocument(); 
    doc.LoadXml(xml); 
    foreach (XmlNode node in doc.GetElementsByTagName("FieldRef")) 
     Console.WriteLine(node.Attributes["Name"].Value); 
+0

el problema es que esta cadena no es fija, algunas veces no contendrá el elemento GroupBy, algunas veces contendrá el elemento OrderBy. Necesito elegir FieldRef y debería saber a qué elemento raíz pertenece. – Waleed

Cuestiones relacionadas