Insertar datos XML

26. April 2009 05:47 by Oscar.SS in XML  //  Tags:   //   Comments (29)

Anteriormente vimos como leer datos y escribir datos en un archivo XML. Ahora vamos a mostrar como insertar un nodo o registro en cualquier lugar del árbol de nodos del archivo XML. 

Aunque comenzaremos viendo como insertar un nodo al final de un archivo, que es la operación más habitual, luego veremos como insertar un registro de forma más controlada.

Dado que las clases que vamos a utilizar para este ejemplo ya fuerón explicadas anteriormente recomiendo a todo el mundo que lean en primer lugar los artículos precedentes. Además el modelo de archivo XML es el mismo que en los ejemplos anteriores.

En primer lugar crearemos el nodo que deseamos insertar.

 

      private XmlNode CrearNodoXml(string id, string nom, string ape, string nss, string fijo, string mvl)
      {
         
//Creamos el nodo que deseamos insertar.
         
XmlElement empleado documento.CreateElement("empleado");

         
//Creamos el elemento idEmpleado.
         
XmlElement idEmpleado documento.CreateElement("idEmpleado");
         
idEmpleado.InnerText id;
         
empleado.AppendChild(idEmpleado);

         
//Creamos el elemento nombre.
         
XmlElement nombre documento.CreateElement("nombre");
         
nombre.InnerText nom;
         
empleado.AppendChild(nombre);

         
//Creamos el elemento apellidos.
         
XmlElement apellidos documento.CreateElement("apellidos");
         
apellidos.InnerText ape;
         
empleado.AppendChild(apellidos);

         
//Creamos el elemento numeroSS.
         
XmlElement numeroSS documento.CreateElement("numeroSS");
         
numeroSS.InnerText nss;
         
empleado.AppendChild(numeroSS);

         
//Creamos el elemento telefonos.
         
XmlElement telefonos documento.CreateElement("telefonos");
         
empleado.AppendChild(telefonos);

               
//Creamos el elemento fijo.
               
XmlElement nodoFijo documento.CreateElement("fijo");
               
nodoFijo.InnerText fijo;
               
telefonos.AppendChild(nodoFijo);
               
//Creamos el elemento movil.
               
XmlElement movil documento.CreateElement("movil");
               
movil.InnerText mvl;
               
telefonos.AppendChild(movil);

         return 
empleado;
      
}

 

Una vez que tenemos el nodo creado procedemos a insertar un registro al final del documento XML.

 

      private void InsertarXml()
      {
         
//Cargamos el documento XML.
         
documento = new XmlDocument();
         
documento.Load(ruta);

         
//Creamos el nodo que deseamos insertar.
         
XmlNode empleado = this.CrearNodoXml("4""Gerardo""Montaz Soaz""444-444-444-444""893434220""609334209");

         
//Obtenemos el nodo raiz del documento.
         
XmlNode nodoRaiz documento.DocumentElement;

         
//Insertamos el nodo empleado al final del archivo
         
nodoRaiz.InsertAfter(empleado, nodoRaiz.LastChild);   //***

         
documento.Save(ruta);
      
}

Ahora nos fijamos en la función anterior justo en la linea que esta marcada con //*** . Esta linea es la que inserta el nodo precisamente a

continuación del último nodo del documento XML. Como hemos comentado antes esta es la operación más usual pero existen más opciones.

 

  •  Insertar antes del último nodo del documento.
         nodoRaiz.InsertBefore(empleado, nodoRaiz.LastChild);
  • Insertar después del primer nodo del documento.
         nodoRaiz.InsertAfter(empleado, nodoRaiz.FirstChild);
  • Insertar antes del primer nodo del documento.
         nodoRaiz.InsertBefore(empleado, nodoRaiz.FirstChild);
  • Insertar en un lugar determinado del documento.
      nodoRaiz.InsertAfter(empleado, documento.SelectNodes("empleados/empleado").Item(2)); 
En este último caso hay que tener en cuenta que el método Item() accede a la colección de nodos del documento, y esta colección tiene
un índice inicial igual acero. En el ejemplo, hemos insertado el nodo después del elemento 2 de la colección, pero podíamos haberlo insertado 
antes con InsertBefore().


Descargar código:InsertarXML.rar (22,83 kb)

Comments (29) -

Roberto
Roberto
4/26/2009 4:44:46 PM #

Me parece genial tu aporte, muchas gracias era lo que estaba buscando.

Oscar
Oscar
4/26/2009 8:27:07 PM #

Me alegra mucho saber que te ha servido.

Gracias a ti también.

Cabroncete
Cabroncete
4/28/2009 4:01:34 PM #

Podrías poner un ejemplo parecido con búsqueda linQ en un xml...

Oscar
Oscar
4/29/2009 8:52:33 AM #

@Cabroncete.

Lamentablemente LinQ es una tecnología con la que aún no me he metido a fondo...pero en cuanto lo haga seguro que escribo algo sobre el tema.

Gracias por tu comentario.

CHRISTIAN LOAYZA BENAVENTE
CHRISTIAN LOAYZA BENAVENTE
5/18/2009 1:26:55 AM #

ESTOY TRATANDO DE GENERAR UN SITEMAP.XML  PARA REGISTRARLO EN GOOGLE...  ESTO SERA DE MUCHA AYUDA... GRACIAS

Oscar
Oscar
5/18/2009 9:09:21 AM #

Hola Christian. Celebro que sea de ayuda. Gracias a ti por tu comentario.

Elizabeth
Elizabeth
7/8/2009 9:01:51 PM #

Hola que tal Oscar!!

Sabes, me ha ayudado demasiado tu Blog,
pero no he encontrado como hacer para modificar los registros que ya tengo en el documento xml desde C#.

Te agradeceria en el alma tu ayuda. Espero tu respuesta =)

Saludos Alegres!!

Elizabeth
Elizabeth
7/8/2009 9:59:21 PM #


Hola Oscar!!

Segun yo ya te habia escrito mi comentario, pero
no se que psa que y no lo veo jeje.

Bueno, por si no te llego, te escribo para agrdecerte ya que me han servido mucho tus articulos.
Y tambien para pedirte si me pudieras hacer el favor de ayudarme a modificar uno de los registros que ya inserte en el documento xml desde c#.

Agradesco tu atencion y espero poder obtener una respuesta satisfactoria.

Que tengas un excelente dia!
Saludos!!

Elizabeth
Elizabeth
7/8/2009 11:49:34 PM #

Otra vez yo!

Eske apenas voy empezando en esto
y esque cuando trato de ejecutar el codigo para insertar datos me dice que el nombre documento no existe en el contexto actual...que puedo hacer?

Oscar.SS
Oscar.SS
7/9/2009 8:52:07 AM #

Hola Elizabeth:

Te respondo por partes.

1- Para modificar un nodo. Si vas a modificar el nodo completamente siempre puedes borrarlo e insertar uno nuevo en su lugar. Si solo vas a modificar algún elemento hijo de ese nodo, puedes leer el árbol de nodos y acceder hasta él, luego sobrescribes su valor como se hace en www.oscarsotorrio.com/.../Escribir-datos-XML.aspx.

2- Los comentarios no se muestran inmediatamente al escribirlos porque tienen que ser aprobados. Y por la diferencia horaria, cuando tu escribes yo estoy dumiendo Smile

3- Comprueba la ruta que has puesto para cargar el archivo xml. Te recomiendo que agreges el archivo xml en alguna carpeta de tu proyecto.

Un  saludo y suerte.

Ramon Ruiz Garduño
Ramon Ruiz Garduño
6/10/2010 4:54:34 PM #

hola que tal buenos dias disculpa tengo una pregunta para usted o alguien que me pudiera ayudar

Me encuentro trabajando y estoy en el area de desarrollo y estoy en un pequeño proyecto el cual consiste en crear un pequeño programa desde c# desde un documento xml el cual me pide mostrar una vista previa del documento xml y imprimirlo desde c# y me preguntaba si esto se puede hacer y si si se puede quisiera me pudiera ayudar para crearlo sin mas por el momento me despido agradeciendo me pueda responder

Muchas gracias

Ramon Ruiz Garduño
Ramon Ruiz Garduño
6/11/2010 6:24:51 PM #

Hola que tal buenos Dias disculpa tengo una duda hacerca de la programacion de xml con c# y quisiera si me puedes ayudar

En mi trabajo me d¿piden hacer un pequeño programa que inserte docuemntos xml y mandarlos a imprimir con un pequeño programa que estoy elaborando y tengo que crear la vista preliminar y mandarlo a imprimir y espero me aoyes sin mas por el momento me despido no sin antes agraderte me puedas responder gracias

Oscar.SS
Oscar.SS
6/14/2010 2:03:56 PM #

@Ramón.

No has comentado si la aplicación la estás implementando en Web o en Windows Form. Si estás en web entiendo que te podría valer con poner un enlace al documento físico y abrirlo de esta forma con el explorador. El propio explorador te permite también imprimirlo.

Si es una aplicación de escritorio me temo que tendrás que utilizar las extensiones de Office de .NET y tratarlo como un documento. No lo tengo muy claro porque no lo he tenido que hacer nunca.

Un saludo.

Ramon Ruiz Garduño
Ramon Ruiz Garduño
6/16/2010 7:19:38 PM #

Hola Ing. Oscar disculpa tengo una prequeña pregunta

Como le puedo hacer para pasar un documento hecho en xml a un textbox en c# ya tengo mi xml solo que lo quisoero visualizar en un textbox para mandarlo a imprimir espero me pueda ayudar y muhcas gracias

Oscar.SS
Oscar.SS
6/17/2010 9:43:53 AM #

Hola Ramón:

Aquí te dejo un ejemplo.


System.IO.StreamReader sr = new System.IO.StreamReader(rutaArchivoXml);

string textoXml = sr.ReadToEnd();

textBox1.Text = textoXml;

sr.Close();


Espero que te sirva de ayuda y que por favor nos lo digas a todos.

Un saludo.

jasson
jasson
12/14/2010 11:01:22 PM #

Hola te agradesco por el tip, pero dejame hacerte una pregunta y espero puedas responder. Entiendo que documento.Load(ruta); es la ruta donde se encuentra el archivo xml,  pero que sucede cuando la ruta es la del servidor web, como en mi caso que hago un sistema web.
Espero me puedas ayudar y una vez mas excelente tu breve e interesante tutorial.

Oscar.SS
Oscar.SS
12/15/2010 1:28:32 PM #

Hola Jasson:

No entiendo muy bien cuando dices "la ruta es la del servidor web".

¿A que te refieres?, ¿a un WebService? o a que tu aplicación es Web en lugar de Windows.

Si estás hablando de una aplicación web para "encontrar la ruta" de un XML alojado en tu site, puedes utlizar Server.MapPath: msdn.microsoft.com/.../ms524632(VS.90).aspx

Y si te refieres a un Webservice, si el XML está en tu site supongo que con los debidos permisos podrias modificarlo, pero no le veo el sentido a hacer tal cosa.

Un saludo.

Maru
Maru
8/13/2011 4:31:27 AM #

Hola tengo un problema que no entiendo como resolverlo.
Quiero agregar nuevos elementos al nodo <Persona> y siempre me genera pero con todos los datos iguales.
ejemplo
mi archivo xml es el siguiente
<?xml version="1.0" encoding="utf-16"?>
<Personas>
     <Persona>
          <nombre>fernando</nombre>
          <DNI>89</DNI>
     </Persona>
     <Persona>
          <nombre>fernando</nombre>
          <DNI>89</DNI>
     </Persona>
     <Persona>
          <nombre>fernando</nombre>
          <DNI>89</DNI>
     </Persona>
</Personas>

Estoy utilizando visual c sharp y para cargar los elemento <nombre> y <DNI> utizo cajas de textos.
private void button2_Click(object sender, EventArgs e)
        {
XmlDocument docpersonas = new XmlDocument();
            docpersonas.Load("Personas.xml");
XmlElement Personas = docpersonas.DocumentElement;
            XmlNodeList Listapersona = docpersonas.SelectNodes("Personas/Persona");

            using (XmlTextWriter escribir = new XmlTextWriter("Personas.xml", Encoding.Unicode))
            {
                

                if (textBox2.Text.Length != 0 && textBox3.Text.Length != 0)
                { escribir.WriteStartDocument();
escribir.Formatting = Formatting.Indented;
                    escribir.Indentation = 5;
escribir.WriteStartElement("Personas");
                  
                    for (int i = 0; i <= Listapersona.Count; i++)
                    { escribir.WriteStartElement("Persona");
  escribir.WriteElementString("nombre", textBox2.Text);
                        escribir.WriteElementString("DNI", textBox3.Text);
escribir.WriteEndElement();
escribir.WriteEndDocument();
escribir.Flush();
                      
                        }
                
                }
                else
                {
                    MessageBox.Show("Cargar todos los datos", "error");
                }
              
            }
        
        }

El problema es que cada vez que inserto se hacen todos los registros iguales.

Oscar.SS
Oscar.SS
8/14/2011 8:21:44 AM #

Hola Maru:

No puedo probar tu código porque estoy de vacaciones y con acceso limitado a internet.

De todas formas no entiendo muy bien que pretendes conseguir. En el bucle for le estas pasando siempre los mismos datos, el contenido de textBox2 y textBox3, por lo tanto, es normal que siempre escriba los mismos datos.

Por favor, explica un poco que es lo que necesitas hacer.

Un saludo.

daniela
daniela
10/18/2011 6:30:02 PM #

oie muchas gracias me fue de mucha ayuda espero tener contacto contigo para solicitar de tu ayuda jejeje soy nueva en esto Laughing saludos Laughing

NOE
NOE
8/19/2012 9:58:56 PM #

excelente aporte gracias justo lo que etaba buscando.

Oscar.SS
Oscar.SS
8/20/2012 11:04:16 AM #

Gracias a tí por comentar Noe!!

Vladimir
Vladimir
2/9/2013 6:33:28 AM #

Estimado Oscar muchas gracias por la ayuda y quisiera aprovechar de consultarte lo siguiente. como se puede crear un archivo xml fisicamente en el disco antes de realizar la insercion de datos.
Esto serviria para crear una funcion de verificacion antes de tratar de realizar la insercion o lectura de data desde un archivo XML.
Muchas gracias,
Vladimir

Oscar.SS
Oscar.SS
2/9/2013 5:01:40 PM #

Vladimir,

Podrías usar los métodos estáticos de la clase System.IO.File por ejemplo así:

            string Path = @"C:\test.xml";

            if (!File.Exists(Path))
            {
                File.Create(Path);
            }

Pero ten encuenta que esto tan solo crea un archivo que está totalmente en blanco. Luego podrías rellenar este como se explica aquí:

oscarsotorrio.com/.../Escribir-datos-XML.aspx

Un saludo.

Vladimir
Vladimir
2/11/2013 6:08:06 AM #

Estimado Oscar Muchas gracias, lo voy a probar y te estare comentando un abrazo.
Vladimir

Sebastian
Sebastian
6/21/2013 2:24:59 PM #

Hola Oscar.

Soy nuevo en esto del c#.   Necesito hacer lo que explicas en este artículo, es decir, añadir un nodo a un fichero xml ya existente.

Mi pregunta es ¿que es documento?

XmlElement empleado = documento.CreateElement("empleado");

Oscar.SS
Oscar.SS
6/25/2013 10:07:04 AM #

Hola Sebastian,

Perdona la tardanza en contestar.

Documento es la variable privada de la clase que almacena el objeto XmlDocument correctamente cargado.

XmlDocument documento = new XmlDocument();
documento.Load("Ruta y nombre del archivo XML");

Un saludo

Martin Aguirre
Martin Aguirre
9/7/2013 4:37:12 AM #

Buenas,

Estoy llevando este proceso de inserción y eliminación de los registros del xml aunque los hago en vb, tu código me ha servido mucho de ayuda para orientarme así que muchas gracias primero que nada.

mi pregunta es cómo puedo obtener el último registro "id" de mi archivo xml o cualquier campo sin tener que imprimirlo en una consola valla meterlo directamente a una variable ese único valor o registro, dejo el esquema del archivo xml que utilizo.

<?xml version="1.0" encoding="UTF-8"?>
<retiros>
  <retiro id="1">
    <monto>1000</monto>
    <motivo>retiro rutinario</motivo>
    <id_usu>1</id_usu>
    <fecha>06/09/2013 8:00 pm</fecha>
  </retiro>
  <retiro id="2">
    <monto>1300</monto>
    <motivo>demaciado dienro en caja</motivo>
    <id_usu>2</id_usu>
    <fecha>06/09/2013 10:00 pm</fecha>
  </retiro>
</retiros>

Oscar.SS
Oscar.SS
9/8/2013 12:45:48 PM #

Hola Martin:

Espero que esto te ayude: oscarsotorrio.com/.../Lectura-de-datos-XML.aspx

Un saludo

Recent Comments

Comment RSS

Month List