Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema deserializando nodo XML con campos + elementos anidados en .NET

Iniciado por [EX3], 25 de Febrero de 2014, 06:18:54 PM

« anterior - próximo »

[EX3]

Buenas, gente.


Haciendo un proyecto en el trabajo me ha tocado parsear unos XMLs para tratar sus datos. En vez de abrirlos con un XmlDocument y navegarlos nodo a nodo como comúnmente hace la gente, decidí replicar la estructura de datos en clases y aplicar directamente serialización para parsear el XML de un plumazo comodamente y tener una estructura fácil de navegar desde C#. En principio me ha costado un poco hacer la implementación por ciertos detalles de las estructuras del XML pero he conseguido realizar la deserialziación, aunque hay un detalle que no da error pero no ha funcionado como esperaba. Pongo un ejemplo:


// Estructura XML similar al documento que me esta dando problemas:
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<NodoRaiz Atributo="Valor">
    <Nodo1>
        <Elemento1>Valor</Elemento1>
        <Elemento2>Valor</Elemento2>
    </Nodo1>
    <Nodo2>
        <Elemento1>Valor</Elemento1>
        <Elemento2>Valor</Elemento2>
        <Item>
<Elemento1>Valor</Elemento1>
<Elemento2>Valor</Elemento2>
...
        </Item>
        <Item>
<Elemento1>Valor</Elemento1>
<Elemento2>Valor</Elemento2>
...
        </Item>
...
...
...
        <Item>
<Elemento1>Valor</Elemento1>
<Elemento2>Valor</Elemento2>
...
        </Item>
    </Nodo2>
</NodoRaiz>

El Nodo2 del documento es un elemento que contiene 2 elementos/campos y al mismo tiempo enumera otros nodos con contenido dentro de ellos. Inicialmente me encontraba con el problema de que no sabia como replicar en una clase la estructura para representar el nodo con sus dos campos y la enumeración, ya que usar un array para las enumeraciones representaría un nodo en si que no existe en la estructura XML y ni usando [XmlArray()] + [XmlArrayItem()] como he visto en algunas respuestas a dudas similares en Stackoverflow me ha funcionado, el resultado era que obtenía Nodo2 con la información de los dos campos pero el array de elementos vació o sin inicializar (a null, vamos).



public class Nodo2Class
{
public string Elemento1;
public string Elemento2;

[XmlArray("Nodo2")]
[XmlArrayItem("Item")]
public ItemClass[] Items;
}



// Clase que representa el documento desde el nodo raiz:

public class NodoRaiz
{
[XmlAttribute("Atributo")]
public string Atributo;

public Nodo1Class Nodo1;
public Nodo2Class Nodo2;
}



La mejor aproximación a la solución para deserializar Nodo2 y sus enumeraciones ha sido hacer esto en código:


public class Nodo2Class : List<ItemClass>
{
public string Elemento1;
public string Elemento2;
}



Esto me ha devuelto correctamente la representación de Nodo2 con toda la enumeración correctamente deserializada... pero los campos Elemento1 y Elemento2 aparecen como null ¿?. Para salir del paso no me he calentado más la cabeza y después de deserializar el XML he sacado el valor de esos dos campos vía XmlDocument, pero aun me queda la duda de por que pasa lo que comento antes.


¿Alguien sabe a que se debe eso o que estoy haciendo mal o que no he hecho? Ya he probado combinaciones varias que he visto en Stackoverflow y otras webs pero sin lograr el resultado esperado.


Salu2 y gracias por adelantado.
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.