Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Cargar XML

Iniciado por Siam, Diciembre 05, 2016, 01:41:25 PM

Tema anterior - Siguiente tema
Estoy intentando cargar un XML que esta en la misma ruta que el script que lo intenta cargar.
 
 
 

      string name = "1.xml";
   xDoc.Load(name);

 
 
 
Pero da este error
 
NullReferenceException: Object reference not set to an instance of an object

selIdioma.cargarIdioma () (at Assets/Scripts/UI/Idioma/selIdioma.cs:14)

principalController.Start () (at Assets/Scripts/UI/home/principalController.cs:32)
 
Al estar en la misma ruta no valdria solo con poner el nombre ?

Diciembre 05, 2016, 03:00:37 PM #1 Ultima modificación: Diciembre 05, 2016, 03:00:59 PM por lightbug
Hola, esto tengo yo para cargar datos xml en un objeto de una clase serializable:
 

public bool ExistXMLProfile(int profile)
{
   string path = Application.dataPath + "/ProfileData/" + "profile" + profile.ToString() + ".xml";
   if (!File.Exists (path)) {
      return false;
   } else {
      return true;
   }
}
 
public void LoadDataXML(int profile)
{
   string path = Application.dataPath + "/ProfileData/" + "profile" + profile.ToString() + ".xml";
   XmlSerializer serializer = new XmlSerializer( typeof(DataXML));
   FileStream fileStream = new FileStream( path , FileMode.Open );
   dataXML = (DataXML)serializer.Deserialize (fileStream);
   fileStream.Close();
 
}

 
que es el "xDoc" tuyo?, si tu xml esta en Assets (el directorio base de datos) tenes que poner "Application.DataPath/...." ,eso si, tenes que indicar toda la ruta. Ah y primero verificar que exista, sino puede haber nulls dando vueltas. (En el ejemplo anterior lo verifico en otro lado, no en LoadDataXML)


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Xml;
public static class selIdioma  {
static XmlDocument xDoc ;
public static void cargarIdioma()
{
   string name = preferencias.pref.idioma + ".xml";
   xDoc.Load(Application.dataPath + "/Scripts/UI/Idioma/"+name);
}
public static string cargarTexto (string tag, string nodo )
{
   XmlNodeList tagSel = xDoc.GetElementsByTagName(tag);
   return ((XmlElement)tagSel[0]).GetElementsByTagName(nodo)[0].InnerText;
}
}

 
El xDoc es donde csargo el XML, lo unico que quiero es coger el texto del XML, esto lo uso para tener 2 idiomas (o los que sean).
 
 
 
Y lo llamo asi
 

selIdioma.cargarIdioma ();

 
 

La verdad no sabia que asi se podian cargar xml ni conocia los xmlnodes. Yo de xml la verdad no manejo mucho, segui paso a paso el libro "Pro Unity Game Development with C#" de Alan Thorn para cargar datos del juego y fue bastante bien (sorprendentemente).
 
Funciona como está ahora o no?
 
 

La estructura final de la app no es la estructura de árbol que ves en el editor de Unity. Solamente se puede acceder a los directorios "Resources" y "StreamingPath". Para acceder a ellos depende parcialmente del SO final que utilices en tu app (Windows, Android, iOS, ...).
 
Me da la impresión que lo tratas como un exe de Windows de hace unas cuántas versiones.

Y no hay una manera de acceder al XML ?

Podes acerlo de muchas formas, una es colocandolo dentro de una carpeta Resources (en cualquier lado), luego llamando Resource.Load("archivoXML.xml"), otra es como puse en mi ejemplo, pero para eso una vez que tengas el build tenes que colocar los directorios correspondientes en los lugares que determinastes. En PC, Mac y Linux no hay problema, ya en moviles se complica me parece,
 
Lo Mejor es usar recursos en este caso. No estoy completamente seguro si podes cargar un recurso como un archivo XML (por ej podes cargar un recurso como un GameObject, como una Textura, Sprite , etc)

He creado una carpeta en la raiz de mi proyecto, llamada Resources, dentro los XML y en el script
 

var doc = Resources.Load(name);

 
Pero la variable doc queda nula. La variable name contiene unicamente el nombre del archivo (1.xml). No se si lo estoy haciendo bien.
 
Tambien he probado a colocar la raiz
 

var doc = Resources.Load(Application.dataPath + "/Resources/" + name);

 
Aunque me imagino que asi no es.

Asi yo cargo un GameObject (Prefabricado):
 

GameObject obj = Resources.Load("Prefab") as GameObject;

 
Despues de una googleada:
 
http://answers.unity3d.com/questions/59466/loading-xml-file-from-resources-file-after-build.html
 
 

Tengo que aprender a googlear bien, yo estube googlendo y no encontre nada parecido. Funciono perfectamente. Gracias

Etiquetas: