locked
Dudas al usar XML RRS feed

  • Pregunta

  • Hola, es la primera vez que le meto mano a un archivo XML y estoy teniendo problemas. He programado un jueguecillo y ahora quiero modificarlo para que lea los datos desde un XML. Por ejemplo:

    private Mochila mochila;
    private Objeto pelota;
    private Objeto copa;
    ////
    
    List<Interacciones> listav = new List<Interacciones>(); //Interacciones es un enum (ver, coger, tocar, ir, hablar)
    listav.Add(Interacciones.ver);
    pelota = new Objeto(1, "pelota", "Es una pelota",
    "Es de color blanca", new Vector2(400, 590),
    new Vector2(480, 630), listav);
    copa = new Objeto(10, "copa", "Una copa en la mesa",
    "Es una copa de oro", new Vector2(300, 600),
    new Vector2(300, 600), listav);
    List<Objeto> listaMochila = new List<Objeto>();
    listaMochila.Add(pelota);
    List<Objeto> listaCombinados = new List<Objeto>();
    listaCombinados.Add(copa);
    mochila = new Mochila(listaMochila, listaCombinados);
    



    El archivo XML es el siguiente:

    <?xml version="1.0" encoding="utf-8" ?>
    <XnaContent>
      <!-- TODO: replace this Asset with your own XML asset data. -->
      <Asset Type="AG0._1.Mochila"></Asset>
      <inventario>
        <Item>
          <cod>1</cod>
          <nombre>pelota</nombre>
          <descripEsce>Es una pelota</descripEsce>
          <descripMochi>Es de color blanca</descripMochi>
          <posEsce>new Vector(400,590)</posEsce>
          <posInteraccion>new Vector(480,630)</posInteraccion>
          <interacciones>
            <Item>Interacciones.ver</Item>
          </interacciones>
        </Item>
      </inventario>
      <combinados>
        <Item>
          <cod>10</cod>
          <nombre>copa</nombre>
          <descripEsce>Una copa en la mesa</descripEsce>
          <descripMochi>Es una copa de oro</descripMochi>
          <posEsce>new Vector(300,600)</posEsce>
          <posInteraccion>new Vector(300,600)</posInteraccion>
          <interacciones>
            <Item>Interacciones.ver</Item>
          </interacciones>
        </Item>
      </combinados>
    </XnaContent>
    
    

    ///
    mochila = Content.Load<Mochila>("DatosObjetos/DatosMochila"); //DatosMochila.xml
    


    Al ejecutarlo me sale el siguiente error:

    Error    1    There was an error while deserializing intermediate XML. Cannot find type "AG0.1.Mochila".   

    (AG0.1 es el nombre del proyecto y Mochila es la clase que quiero que lea DatosMochila.xml)

    ¿Una ayudita? También me vendría bien algún tutorial (si puede ser con un ejemplo, mejor) tanto para leer un xml como para escribir en él (guardar partida). Googleando lo mejor que es encontrado es esto.

    Un saludo.




    • Editado Jose Achepé jueves, 15 de septiembre de 2011 18:22
    • Tipo cambiado Jose Achepé jueves, 29 de diciembre de 2011 21:57
    jueves, 15 de septiembre de 2011 18:16

Respuestas

  • Feliz año nuevo para todos,

    Bueno veo que lo anterior no te sirvió, o no era lo que querías, así que según entiendo a pesar de todo quieres utilizar el archivo xml como si fuese un asset de contenido de tu proyecto.

    Hice un proyecto pequeño para ver el error que te esta dando, y en verdad a mi también me dio ese error cuando agregue un archivo xml y compile el proyecto, esto se da porque el tipo del asset que se declara en la etiqueta <Asset Type="......"> no existe, veras tu defines la clase pero este no es un tipo de contenido, las clases son tipos de datos, sin embargo se puede usar clases para generar tipos de contenido y es lo que entiendo quieres hacer para esto: en la solución agrega un nuevo proyecto, seleccionas la versión de xna que estés utilizando y escoges la plantilla Windows Game Library en este proyecto agrega la clase que en tu caso seria Prueba ahora desde el proyecto donde agregaste el archivo xml agrega la referencia al proyecto que es un Game Library, prueba ahora compilar, ya no te debería dar error.

    El archivo xml que use tenia:

    <?xml version="1.0" encoding="utf-8" ?>

    <XnaContent>

      <!-- TODO: replace this Asset with your own XML asset data. -->

      <Asset Type="Settings.Settings">

        <edad>18</edad>

        <saludo>Hola</saludo>

      </Asset>

    </XnaContent>

    Ahora para leer este archivo solo tendría que cargar el contenido en una variable así:

    Settings settings = Content.Load<Settings>("Settings");

    Para probar que tu xml se compila como si fuese un archivo de contenido chequea el directorio ..bin\x86\Debug\Content de tu proyecto debería estar el nombre del archivo .xml pero con la extensión .xnb que es la extensión por defecto de los archivos compilados de xna a menos que te definas tu propia extensión de salida, pero eso ya es otro cuento.


    lunes, 2 de enero de 2012 2:43

Todas las respuestas

  • Que tal.
    Como puedo ver en la estructura de xml, lo que creo que hiciste fue agregar a la content un archivo XML que por defecto te queda así

    <?xml version="1.0" encoding="utf-8" ?>
    <XnaContent>
      <!-- TODO: replace this Asset with your own XML asset data. -->
      <Asset Type="System.String"></Asset>
    </XnaContent>

    Con las propiedades
    Content Importer            XML Content - XNA Framework
    Content Processor           No Processing Required
    Copiar en el directorio     No copiar

    La verdad no he utilizado esta estructura en un archivo XML, pero si he utilizado estos archivos para guardar cierta informacion para luego recuperarla y eso me imagino es lo que quieres hacer.
    Te recomiendo veas el ejemplo en el siguiente link http://geeks.ms/blogs/jbosch/archive/2010/05/23/detecci-243-n-de-colisiones-en-un-mundo-3d-episode-iii.aspx
    Un ejemplo de colisiones y para esto utiliza un archivo XML en el que guarda información de algunos objetos, el archivo xml esta en el directorio Content\Niveles, fijate en las propiedades del archivo.


    Espero haberte ayudado.

    lunes, 19 de septiembre de 2011 2:31
  • Sigo con dudas referentes a crear un archivo XML, y más en XNA 4.0 que no se encuentran ejemplos. 

    He creado una clase Prueba:

     

    namespace Monkeycode
    {
        public class Prueba
        {
            public int numero;
            public String cadena;
    
            public Prueba(int n, String c)
            {
                this.numero = n;
                this.cadena = c;
            }
        }
    }

    Y después he creado un documento XML en el Content:

     

    <?xml version="1.0" encoding="utf-8" ?>
    <XnaContent>
      <!-- TODO: replace this Asset with your own XML asset data. -->
      <Asset Type="Monkeycode.Prueba">
        <numero>5</numero>
        <cadena>hola</cadena>
      </Asset>
    </XnaContent>

    Sin agregarlo al Main ni nada , al ejecutar el programa me salta el siguiente error:

    Se produjo un error al deserializar XML intermedio. No se encuentra el tipo "Monkeycode.Prueba".

     //D:\Proyectos C#\Monkeycode\Monkeycode\MonkeycodeContent\XMLFile1.xml

    //Linea 4 //Columna 10 //Proyecto Monkeycode

     

    He probado con otras clases y no hay forma, siempre salta el mismo error en la misma línea y columna. ¿Que hago mal?
    jueves, 29 de diciembre de 2011 19:42
  • Feliz año nuevo para todos,

    Bueno veo que lo anterior no te sirvió, o no era lo que querías, así que según entiendo a pesar de todo quieres utilizar el archivo xml como si fuese un asset de contenido de tu proyecto.

    Hice un proyecto pequeño para ver el error que te esta dando, y en verdad a mi también me dio ese error cuando agregue un archivo xml y compile el proyecto, esto se da porque el tipo del asset que se declara en la etiqueta <Asset Type="......"> no existe, veras tu defines la clase pero este no es un tipo de contenido, las clases son tipos de datos, sin embargo se puede usar clases para generar tipos de contenido y es lo que entiendo quieres hacer para esto: en la solución agrega un nuevo proyecto, seleccionas la versión de xna que estés utilizando y escoges la plantilla Windows Game Library en este proyecto agrega la clase que en tu caso seria Prueba ahora desde el proyecto donde agregaste el archivo xml agrega la referencia al proyecto que es un Game Library, prueba ahora compilar, ya no te debería dar error.

    El archivo xml que use tenia:

    <?xml version="1.0" encoding="utf-8" ?>

    <XnaContent>

      <!-- TODO: replace this Asset with your own XML asset data. -->

      <Asset Type="Settings.Settings">

        <edad>18</edad>

        <saludo>Hola</saludo>

      </Asset>

    </XnaContent>

    Ahora para leer este archivo solo tendría que cargar el contenido en una variable así:

    Settings settings = Content.Load<Settings>("Settings");

    Para probar que tu xml se compila como si fuese un archivo de contenido chequea el directorio ..bin\x86\Debug\Content de tu proyecto debería estar el nombre del archivo .xml pero con la extensión .xnb que es la extensión por defecto de los archivos compilados de xna a menos que te definas tu propia extensión de salida, pero eso ya es otro cuento.


    lunes, 2 de enero de 2012 2:43
  • Hola, lo anterior me sirvió pero al pasar mi proyecto a la versión XNA 4.0 me daba error con lo que pensaba que había cambiando en la versión 4.0 y había que hacerlo de esa forma. Investigando, lo acabo de solucionar (el problema era por otra cosa). Por si a alguien le interesa, pongo un ejemplo rápido:

    Prueba prueba = new Prueba();

    //Escribir en archivo:

    XmlSerializer ser = new XmlSerializer(typeof(Prueba));
    TextWriter escritor = new StreamWriter(@"D:\Prueba2.xml"); //dirección a guardar
    ser.Serialize(escritor, prueba);
    escritor.Close();

    //Leer un archivo:

    ser = new XmlSerializer(typeof(Prueba));
    StreamReader file = new StreamReader(@"D:\Prueba2.xml"); //dirección del archivo a leer
    prueba = (Prueba)ser.Deserialize(file);
    file.Close();

    //Clase Prueba:

    namespace WindowsGamePrueba
    {
        public class Prueba
        {
            public int numero;
            public String nombre;
    
            public Prueba()
            { }
        }
       
    }

    //Archivo XML:

    <?xml version="1.0" encoding="utf-8"?>
    <Prueba xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <numero>50</numero>
      <nombre>Pepe</nombre>
    </Prueba>

    Por otra parte, sobre esta nueva forma de usar un XML para generar contenido que me has explicado, al compilar ya no me da error pero al cargar el contenido si me lo da porque no puede encontrar el tipo "Settings", pese a que está incluido en el proyecto. Si puedes pasarme tu ejemplo para echarle un vistazo te lo agradecería.

    Muchas gracias por la ayuda!




    lunes, 2 de enero de 2012 19:23