none
pasar treeview a xml RRS feed

  • Pregunta

  • hola, 

    he estado consultando este punto y casi no encuentro informacion, encuentro es al revez de xml a treeview, 

    como puedo pasar los elementos de un treeview y crear un archivo xml con estos¿?, tal vez halla una solucion en la que no 

    tenga que utilizar una clase para la recoleccion de datos¿?

    muchas gracias

    viernes, 9 de abril de 2010 12:56

Respuestas

  • Hola crituscam.

    este es un ejemplo de recursividad para recorrer todo el TreeView y guardarlo en un xml:

    /// <summary>
            /// Funcion para guardar el treeView en un archivo xml
            /// </summary>
            /// <param name="sender">objeto remitente</param>
            /// <param name="e">argumentos del evento</param>
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                // crear el documento
                System.Xml.Linq.XDocument doc = new System.Xml.Linq.XDocument();
    
                // crear el nodo raiz para el documento xml
                System.Xml.Linq.XElement root = new System.Xml.Linq.XElement("Root");
                doc.Add(root);
    
                // recorrer el TreeView recursivamente
                foreach (object item in treeView1.Items)
                {
                    // obtener el item
                    TreeViewItem treeViewItem = (TreeViewItem)item;
    
                    // añadir el elemento raiz
                    System.Xml.Linq.XElement element = new System.Xml.Linq.XElement(treeViewItem.Header.ToString());
                    root.Add(element);
                    // recorrer recursivamente todos los items hijos
                    writeElements(treeViewItem, element);
                }
    
                // guardar el documento
                doc.Save("archivo.xml");
            }
    
            /// <summary>
            /// Funcion recursiva para recorrer todos los items hijos
            /// </summary>
            /// <param name="_RootItem">TreeViewItem padre del TreeView</param>
            /// <param name="_RootItem">elemento padre del xml</param>
            private void writeElements(TreeViewItem _RootItem, System.Xml.Linq.XElement _parent)
            {
                // bucle para recorrer todos los items
                // recorrer el arbol recursivamente
                foreach (object item in _RootItem.Items)
                {
                    // obtener el item
                    TreeViewItem treeViewItem = (TreeViewItem)item;
                    // añadir el elemento raiz
                    System.Xml.Linq.XElement element = new System.Xml.Linq.XElement(treeViewItem.Header.ToString());
                    _parent.Add(element);  
    
                    // recorrer recursivamente todos los items hijos
                    writeElements(treeViewItem, element);
                }
            }

     

    si tienes algun problema con el codigo comentalo.

    Tambien te pueden servir estos post:

    http://social.msdn.microsoft.com/Forums/es-ES/wpfes/thread/572505f5-1636-47c5-88d3-ad960164bcfb

    http://social.msdn.microsoft.com/Forums/es-es/wpfes/threads?page=2

     

     

     

     


    Saludos
    David González
    • Propuesto como respuesta David_González lunes, 19 de abril de 2010 6:12
    • Marcado como respuesta ccmmasi sábado, 24 de abril de 2010 1:40
    lunes, 12 de abril de 2010 12:11
  • para ello, tienes que saber que elementos del TreeView van a ser nodos y que elementos van a ser texto que va dentro de los nodos.
    Saludos
    David González
    • Marcado como respuesta ccmmasi sábado, 24 de abril de 2010 1:41
    jueves, 15 de abril de 2010 19:36

Todas las respuestas

  • Hola crituscam.

    este es un ejemplo de recursividad para recorrer todo el TreeView y guardarlo en un xml:

    /// <summary>
            /// Funcion para guardar el treeView en un archivo xml
            /// </summary>
            /// <param name="sender">objeto remitente</param>
            /// <param name="e">argumentos del evento</param>
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                // crear el documento
                System.Xml.Linq.XDocument doc = new System.Xml.Linq.XDocument();
    
                // crear el nodo raiz para el documento xml
                System.Xml.Linq.XElement root = new System.Xml.Linq.XElement("Root");
                doc.Add(root);
    
                // recorrer el TreeView recursivamente
                foreach (object item in treeView1.Items)
                {
                    // obtener el item
                    TreeViewItem treeViewItem = (TreeViewItem)item;
    
                    // añadir el elemento raiz
                    System.Xml.Linq.XElement element = new System.Xml.Linq.XElement(treeViewItem.Header.ToString());
                    root.Add(element);
                    // recorrer recursivamente todos los items hijos
                    writeElements(treeViewItem, element);
                }
    
                // guardar el documento
                doc.Save("archivo.xml");
            }
    
            /// <summary>
            /// Funcion recursiva para recorrer todos los items hijos
            /// </summary>
            /// <param name="_RootItem">TreeViewItem padre del TreeView</param>
            /// <param name="_RootItem">elemento padre del xml</param>
            private void writeElements(TreeViewItem _RootItem, System.Xml.Linq.XElement _parent)
            {
                // bucle para recorrer todos los items
                // recorrer el arbol recursivamente
                foreach (object item in _RootItem.Items)
                {
                    // obtener el item
                    TreeViewItem treeViewItem = (TreeViewItem)item;
                    // añadir el elemento raiz
                    System.Xml.Linq.XElement element = new System.Xml.Linq.XElement(treeViewItem.Header.ToString());
                    _parent.Add(element);  
    
                    // recorrer recursivamente todos los items hijos
                    writeElements(treeViewItem, element);
                }
            }

     

    si tienes algun problema con el codigo comentalo.

    Tambien te pueden servir estos post:

    http://social.msdn.microsoft.com/Forums/es-ES/wpfes/thread/572505f5-1636-47c5-88d3-ad960164bcfb

    http://social.msdn.microsoft.com/Forums/es-es/wpfes/threads?page=2

     

     

     

     


    Saludos
    David González
    • Propuesto como respuesta David_González lunes, 19 de abril de 2010 6:12
    • Marcado como respuesta ccmmasi sábado, 24 de abril de 2010 1:40
    lunes, 12 de abril de 2010 12:11
  • hola  David 

    tu codigo de recursividad para recorrer todo el TreeView y guardarlo en un xml me funciona muy bien pero en el caso de que los textos esten sin " " (espacio en blanco) pero cuando tengo un texto que tenga espacio como "tarea 1" el cual contiene espacio en blanco me genera un error,

     

    private void writeElements(TreeViewItem _RootItem, System.Xml.Linq.XElement _parent)
            {
                // bucle para recorrer todos los items
                // recorrer el arbol recursivamente
                foreach (object item in _RootItem.Items)
                {
                    // obtener el item
                    TreeViewItem treeViewItem = (TreeViewItem)item;
                    // añadir el elemento raiz
                    System.Xml.Linq.XElement element = new System.Xml.Linq.XElement(treeViewItem.Header.ToString());
                    //element = XElement.Parse(treeViewItem.Header.ToString(), LoadOptions.PreserveWhitespace);
                    _parent.Add(element);

                    // recorrer recursivamente todos los items hijos
                    writeElements(treeViewItem, element);
                }
            }

    System.Xml.Linq.XElement element = new System.Xml.Linq.XElement(treeViewItem.Header.ToString());

    este es el error

    No se control XMLexcepcion:

    El carácter ' ', con valor hexadecimal 0x20, no puede incluirse en un nombre.

    buscando encontre un metodo para que acepte los espacios en blanco .

    tanto en

    doc = XDocument.Parse(treeViewItem.Header.ToString());

    como en

    element = XElement.Parse(treeViewItem.Header.ToString(), LoadOptions.PreserveWhitespace);

    pero no me funciona me podrias ayudar para que cuando en el arbol contenta texto con espacios me acepte sin ningun problema y guarde en el xml normalmente.

    Muchas Gracias.

     


     

    martes, 13 de abril de 2010 13:54
  • Hola Luisafer.

    Si, tienes razon, pero esto es debido a la especificacion xml, los elementos no pueden comenzar por numeros ni pueden contener espacios en blanco, deberas sustituirlos por algun caracter como barra baja '_'.

     

    <raiz>
        <nodo primario />
    </raiz>

     

    esto no es valido en un documento xml y deberas sustituirlo por algo como:

     

    <raiz>
        <nodo_primario />
    </raiz>

     

    de echo si te fijas el parseador de este post, establece primario con un color de atributo, lo cual no es valido al no tener valor.

     

     

     


    Saludos
    David González
    martes, 13 de abril de 2010 15:43
  • hola

    muchas gracias david,

    he probado el codigo y me sirvio mucho, al igual que luisafer me sale error en los espacios, he pensado que en el momento de añadir los items al arbol recorra la cadena y cambie el espacio por la linea baja "_". tambien se sale error si el primer elemento del item es un numero.

    muchas gracias por tu ayuda!!!

    otra cosa es que este archivo xml que estoy creando quiero que se lea desde un datagrid, y desde este tengo parametros establecidos para que lea solo ciertos items, 

    el encabezado del datagrid tiene esto:

     

    XPath=DocumentElement/Item}
    y en una columana tengo esto:

     

     

    <dg:DataGridTemplateColumn Header="Tarea" Width="100">
                                            <dg:DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate x:Name="Tarea">
                                                    <TextBlock Name="tarea" Text="{Binding Mode=TwoWay, XPath=Nombre}"/>
                                                </DataTemplate>
                                            </dg:DataGridTemplateColumn.CellTemplate>
                                        </dg:DataGridTemplateColumn>

    como ven estoy haciendo un binding con XPath="Nombre", y llego a este por este camino: DocumentElement/Item, y resulta que el archivo xml no me genera este elemento, ni Item ni nombre. 

    y aunque este tema ya es de datagrid y no de exportar a xml se llego un momento en que se me unieron.

    como puedo crear el xml con etiquetas comunes para cada item o elemento del arbol, Ó como puedo hacer para que el datagrid me tome los elementos del xml sin que tenga en cuenta las etiquetas (en este momento me esta reconociendo la etiqueta Nombre), ya que el codigo de pasar treeview a xml me genera etiquetas que son el mismo nombre.

    actual archivo xml

    <?xml version="1.0" encoding="utf-8"?>
    <Root>
      <Inicio>
        <Ejecucion_de_tareas>
          <Proyectos_destinados />
        </Ejecucion_de_tareas>
        <Planificacion_de_proyectos />
      </Inicio>
      <Planeacion />
      <Ejecucion>
        <ejecucion_de_Tareas />
      </Ejecucion>
      <Seguimiento_y_control />
    </Root>

    anterior archivo xml

    <?xml version="1.0" standalone="yes"?>
    <DocumentElement>
      <Item>
        <Nombre>Fase Ejercicio 1</Nombre>
        <Hijo>Lote de Control 1</Hijo>
        <Hijodehijo>Lote de Control 12</Hijodehijo>
      </Item>
      <Item>
        <Nombre>Fase Ejercicio 2</Nombre>
      </Item>
      <Item>
        <Nombre>Fase Ejercicio 3</Nombre>
      </Item>
      <Item>
        <Nombre>Fase Ejercicio 4</Nombre>
      </Item>
    </DocumentElement>

    muchas gracias por su ayuda, gracias

    cristian

    miércoles, 14 de abril de 2010 16:22
  • Hola crituscam.

    No entiendo bien tu pregunta del xml.

    ¿que xml quieres leer y que nodo?

    De todas formas el xml "actual" no te va ha funcionar para este enlace, debes usar un formato como el "anterior" xml


    Saludos
    David González
    jueves, 15 de abril de 2010 18:11
  • Hola crituscam.

    No entiendo bien tu pregunta del xml.

    ¿que xml quieres leer y que nodo?

    De todas formas el xml "actual" no te va ha funcionar para este enlace, debes usar un formato como el "anterior" xml


    Saludos
    David González
    jueves, 15 de abril de 2010 18:11
  • hola

    EXACTO!!!, 

    quisiera saber como puedo pasar los elementos del treeview a xml con unas etiquetas como las que se ven en el archivo xml "anterior", como puedo hacer esto¿?

    jueves, 15 de abril de 2010 18:14
  • para ello, tienes que saber que elementos del TreeView van a ser nodos y que elementos van a ser texto que va dentro de los nodos.
    Saludos
    David González
    • Marcado como respuesta ccmmasi sábado, 24 de abril de 2010 1:41
    jueves, 15 de abril de 2010 19:36
  • vale david, voy a seguir intentando lo que me dices, cuando tenga algo te aviso... muchas gracias
    martes, 20 de abril de 2010 23:52