none
Como puedo recorrer nodos de un xml Asociando nodos hijos a nodos padres? c# RRS feed

  • Pregunta

  • Tengo este xml el cual quiero recorrer y asociar cada nodo padre con sus nodos hijos identificando que nodo hijo pertenece a que nodo padre, utilizando una función que sirva para cualquier xml.

    El xml lo recibo de un Procedimiento Almacenado en sql

      <xs:element name="data_captura">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="encabezado" maxOccurs="unbounded">
              <xs:complexType>
                <xs:all>
                  <xs:element name="radicado_entidad" minOccurs="0">
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element name="valor" type="xs:string" />
                        <xs:any maxOccurs="unbounded" minOccurs="0" processContents="lax" />
                      </xs:sequence>
                      <xs:anyAttribute processContents="lax" />
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="fecha_radicacion" minOccurs="0">
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element name="valor" type="xs:date" />
                        <xs:any maxOccurs="unbounded" minOccurs="0" processContents="lax" />
                      </xs:sequence>
                      <xs:anyAttribute processContents="lax" />
                    </xs:complexType>
                  </xs:element>
              </xs:all>
                <xs:anyAttribute processContents="lax" />
              </xs:complexType>
            </xs:element>
            
    
    Agradezco si alguien sabe como lograr recorrerlo realizando dicha asociación, ya que no entiendo muy bien como plantear el código.
    
    un ejemplo del resultado esperado seria (data_captura.encabezado.radicado_entidad) padre.hija.hija respectivamente.
    
    
    
    Saludos¡¡
    lunes, 13 de julio de 2020 22:31

Respuestas

  • Hola WiseSensei, 

      

    Primero tienes que leer el xml 

    https://support.microsoft.com/es-cr/help/307548/how-to-read-xml-from-a-file-by-using-visual-c

    Despues puedes agarrar cada tag y seleccionarlos por cada nodo te dejo este ejemplo

    <command> <Name>one</Name> <data> <int>46</int> <int>49</int> </data> <rangeData> <int>36</int> <int>29</int> </rangeData> </command>

    string filename = "01.xml";

    XmlDocument xdc = new XmlDocument(); xdc.Load(filename); XmlNodeList xnlNodes = xdc.SelectNodes("command"); foreach (XmlNode xnlNode in xnlNodes) { XmlElement element = (XmlElement)xnlNode; string Name = Convert.ToString(xnlNode["Name"].InnerText); int[] data = new int[] { Convert.ToInt32(element.GetElementsByTagName("data")[0].ChildNodes[0].InnerText), Convert.ToInt32(element.GetElementsByTagName("data")[0].ChildNodes[1].InnerText), }; int[] rangeData = new int[] { Convert.ToInt32(element.GetElementsByTagName("rangeData")[0].ChildNodes[0].InnerText), Convert.ToInt32(element.GetElementsByTagName("rangeData")[0].ChildNodes[1].InnerText), };

    }

    Gracias por usar los foros de MSDN.   

     

     Andres Aguilar

     ____________________________ 

      

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

    • Marcado como respuesta WiseSensei martes, 14 de julio de 2020 17:41
    martes, 14 de julio de 2020 17:15
    Moderador

Todas las respuestas

  • Hola:

    ¿Cómo obtener valor de elementos hijos de un nodo en documento XML?

    XmlNode.ChildNodes Property

    https://docs.microsoft.com/es-es/dotnet/api/system.xml.xmlnode.childnodes?view=netcore-3.1

    using System;
    using System.IO;
    using System.Xml;
    
    public class Sample {
    
      public static void Main() {
    
        XmlDocument doc = new XmlDocument();
        doc.LoadXml("<book ISBN='1-861001-57-5'>" +
                    "<title>Pride And Prejudice</title>" +
                    "<price>19.95</price>" +
                    "</book>");
    
        XmlNode root = doc.FirstChild;
    
        //Display the contents of the child nodes.
        if (root.HasChildNodes)
        {
          for (int i=0; i<root.ChildNodes.Count; i++)
          {
            Console.WriteLine(root.ChildNodes[i].InnerText);
          }
        }
      }
    }


    http://electronica-pic.blogspot.com

    lunes, 13 de julio de 2020 23:50
  • hola

     >>El xml lo recibo de un Procedimiento Almacenado en sql

    porque un procedure te retorna un xml ? eso no es correcto

    no sera que estas trabajando un dataset?

    o quizas se trate de un .edmx que es el mapping que usa entity framework?

    >>como lograr recorrerlo realizando dicha asociación

    No tiene que recorrer nada, es un xml y los tags de deben poder parsear a una entidad

    lo que no queda claro es porque obtienes un xml con esa estructura ni que la genera

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 14 de julio de 2020 0:41
  • Si, estoy accediendo a un registro en una bd sql, y un campo contiene este xml.

    Lo que realmente quiero saber es como asociar los nodos entre hijos y padres, para crear una trazabilidad o raiz de cada campo, no tengo claro como hacerlo por eso dije recorrer. Fallo mio.

    Gracias Leandro

    Saludos ¡¡

    martes, 14 de julio de 2020 13:48
  • Hola WiseSensei, 

      

    Primero tienes que leer el xml 

    https://support.microsoft.com/es-cr/help/307548/how-to-read-xml-from-a-file-by-using-visual-c

    Despues puedes agarrar cada tag y seleccionarlos por cada nodo te dejo este ejemplo

    <command> <Name>one</Name> <data> <int>46</int> <int>49</int> </data> <rangeData> <int>36</int> <int>29</int> </rangeData> </command>

    string filename = "01.xml";

    XmlDocument xdc = new XmlDocument(); xdc.Load(filename); XmlNodeList xnlNodes = xdc.SelectNodes("command"); foreach (XmlNode xnlNode in xnlNodes) { XmlElement element = (XmlElement)xnlNode; string Name = Convert.ToString(xnlNode["Name"].InnerText); int[] data = new int[] { Convert.ToInt32(element.GetElementsByTagName("data")[0].ChildNodes[0].InnerText), Convert.ToInt32(element.GetElementsByTagName("data")[0].ChildNodes[1].InnerText), }; int[] rangeData = new int[] { Convert.ToInt32(element.GetElementsByTagName("rangeData")[0].ChildNodes[0].InnerText), Convert.ToInt32(element.GetElementsByTagName("rangeData")[0].ChildNodes[1].InnerText), };

    }

    Gracias por usar los foros de MSDN.   

     

     Andres Aguilar

     ____________________________ 

      

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

    • Marcado como respuesta WiseSensei martes, 14 de julio de 2020 17:41
    martes, 14 de julio de 2020 17:15
    Moderador
  • Hola WiseSensei

    Gracias por confirmar que se ha encontrado una solución a la consulta realizada. Debido a ello, este hilo será cerrado. 

    Si es necesario, por favor abra un nuevo hilo. 

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN. 

     

     Andres Aguilar

    ____________________________ 

      

    martes, 14 de julio de 2020 18:16
    Moderador