Buscar

jueves, 26 de junio de 2008

Leer y modificar un XML desde C# .NET

Este código muestra una forma fácil de leer y modificar un
archivo XML desde .NET , utilizando un DataSet.

Espacio de nombres “System.Data”

Archivo XML (Config.xml)
-----------------------------------------------------------
<?xml version="1.0" standalone="yes"?>
<config>
<asesor>
<cedula>123456</cedula>
<email>jaas.jaas@gmail.com</email>
</asesor>
</config>

----------------------------------------------------------

Código:

using System.Data;

public
static void LeerYModificarXML()
{
/*********Para leer un valor*********************/

DataSet ds = new DataSet();//Se crea un dataset
ds.ReadXml("Config.xml");//Dirección del archivo xml
string Valor = ds.Tables["asesor"].Rows[0]["cedula"].ToString(); //Leemos el primer valor (Rows[0])

/*******Para Guardar un valor*******************/

ds.Tables["asesor"].Rows[0]["cedula"] = Valor; // Modificar un valor
ds.WriteXml("Config.xml"); // Guardamos las modificaciones

}

20 comentarios:

  1. Hola maestro, ya ha pasado largo tiempo desde este ejemplo, pero necesito hacerte una pregunta con la sigueinte linea puedes leer el primer registro del xml..
    string Valor = ds.Tables["asesor"].Rows[0]["cedula"].ToString(); //Leemos el primer valor (Rows[0])
    la pregunta del millon es como puedo recorrer todos los registros del xml.
    ojala te puedas hacer el tiempo para responder.
    saludos y gracias de antemano
    Esteban.

    ResponderEliminar
  2. Esteban, al cargar un xml en un dataSet queda como si fuera una base de datos, entonces si quieres leer todos los registros de ese nodo vasta con hacer un ciclo ejemplo:
    for(int i=0;i<=ds.Tables["asesor"].Rows.Count;i++)
    {
    tring Valor = ds.Tables["asesor"].Rows[i]["cedula"].ToString()
    }
    aquí leeríamos todas las cédulas que hay en el nodo asesores; si quisiéramos leer el mail pues simplemente cambiamos Rows[i]["cedula"] por Rows[i]["email"], ahora si hubiera mas nodos fuera del nodo asesor, entonces estos se comportan como si fueran las tablas entonces para leer otro nodo(en caso de de exista por ejemplo el nodo cliente)




    123456
    jaas.jaas@gmail.com


    222222
    jaas.jaas2@gmail.com




    entonces se leería así :
    for(int i=0;i<=ds.Tables["Cliente"].Rows.Count;i++)
    {
    tring Valor = ds.Tables["Cliente"].Rows[i]["cedula"].ToString()
    }


    espero quede resuelta tu duda.

    ResponderEliminar
  3. Hola Jaas, estoy realizando pruebas con los ciclos, pero me sale el siguiente error:

    No hay ninguna fila en la posición 2.

    Descripción: Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código.

    el ejemplo lo estoy mandando a llamar desde un boton.


    protected void Button5_Click(object sender, EventArgs e)
    {
    DataSet ds = new DataSet();//Se crea un dataset
    ds.ReadXml(@"c:\paso.xml");//Dirección del archivo xml
    for(int i=0;i<=ds.Tables["asesor"].Rows.Count;i++)
    {
    string Valor = ds.Tables["asesor"].Rows[i]["cedula"].ToString();

    Response.Write(Valor);
    //aca mando un alert pero no me deja poner el script

    }
    }


    y el xml esta de la siguiente forma.




    987654
    jaas.jaas@gmail.com


    123456
    estebane@gmail.com



    ojala puedes indicarme donde puede estar el error.
    saludos y grcias.
    Esteban

    ResponderEliminar
  4. Esteban ... ciertamente hay un error porque el ciclo debe ser: for(int i=0;i<ds.Tables["asesor"].Rows.Count;i++)

    for(int i=0;i<ds.Tables["asesor"].Rows.Count;i++)
    {
    string Valor = ds.Tables["asesor"].Rows[i]["cedula"].ToString();

    Response.Write(Valor);
    //aca mando un alert pero no me deja poner el script

    }

    ya que Rows.Count empieza a contar los elementos desde 1 y el indice de las tablas empieza desde 0

    Espero ahora si quede resuelto el problema, si no vuelve a comentar
    Suerte.

    ResponderEliminar
  5. Jaas, Muchas gracias por tu ayuda ya estoy recorreindo el xml y comparando la informacion contra una base de datos.
    saludos.
    Esteban!

    ResponderEliminar
  6. Gracias Flaco. Me salvaste, Espero algún día poder devolver lo q vos me diste hoy. Hugo

    ResponderEliminar
  7. Hola jaas y si alguna de las etiquetas tuviera un atributo? como leo la información de ese atributo?

    ResponderEliminar
  8. como adicionar un atributo a una etiqueta xml desde c#

    ResponderEliminar
  9. Puede leer el xml como se muestra en el ejemplo, y después agregarle una columna a la tabla y guardar de nuevo el dataset como xml.

    ResponderEliminar
  10. hola, quisiera ver si me pudiera ayudar con una duda, como puedo obtener los valores de etiquetas dentro de etiquetas?? usando su ejemplo, seria usar los campos 'opcion1' y 'opcion2' que corresponden a email.

    <* email>
    <*opcion1>opcion1@ejemplo.com<*/opcion1>
    <*opcion2>opcion2@ejemplo.com<*/opcion2>
    <* /email>

    ResponderEliminar
  11. Hola, me topé con un problema a la hora de escribir en el archivo XML.
    Cuando leeo el archivo, este requiere que use la siguiente sentencia

    DataSet elxml = new DataSet();
    elxml.ReadXml("//storage//self//primary//Configuracion.xml");
    string DirFileXML = elxml.Tables["Configuracion"].Rows[0]["WebService"].ToString();
    y obtengo el valor sin problemas pero a la hora de intentar realizar una escritura de algún cambio como este en ejemplo:}
    elxml.Tables["Configuracion"].Rows[0]["WebService"] = etDireccionWS.Text;
    elxml.WriteXml("//storage//self//primary//Configuracion.xml");
    este marca el siguiente erro:
    e.Message = "Access to the path \"/storage/self/primary/Configuracion.xml\" is denied."
    ¿que me sugieren al respecto?
    Saludos.

    ResponderEliminar
    Respuestas
    1. Jejejejeje ya encontré yo la solución a mi problema y es la aparentemente mas fácil.
      de usar el path: //storage//self//primary//Configuracion.xml
      es mejor invocar al path así
      string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal).ToString();
      la cual es /data/user/0/XXXX.XXXX/files
      Solo alojas el archivo en esta ubicación y listo ya puedes interactuar con el sin problemas.
      Apollence con el device monitor y usen un Toast.MakeText para saber donde esta su path de su proyecto.

      Eliminar
  12. Estimados:
    Cómo se verifica que el método WriteXML finalizó con éxito?

    ResponderEliminar
  13. Excelente aporte..!!!! Gracias TOTALES.....

    ResponderEliminar
  14. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  15. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  16. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  17. Buenos días

    Podrían por favor decirme como puedo modificar o incluir un elemento mas a un xml

    Necesito incluir el namespace NumOperacion

    Como comentario es un complemento de pago

    Gracias por sus atenciones y pronta ayuda

    ResponderEliminar
  18. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  19. Modificar XML del Complemento de pago

    Necesito agregar el elemento NumOperacion al Complemento de Pago

    Soy nuevo en esto de los xml y necesito editar el Complemento de Pago y agregar el campo NumOperacion

    Este es un ejemplo de como debe de quedar

    (




    )

    Saludos y gracias!!!

    Nota: no me explico porque no se visualiza la estructura del xml que quiero modificar

    ResponderEliminar