leer jespxml escribir crear archivos ios xml serialization unity3d deserialization

ios - jespxml - ¿Cómo leer y escribir un archivo xml en la misma ubicación?



leer y escribir archivos xml (1)

He preparado archivos xml con algunos contenidos y quiero cargarlos mientras juego en un dispositivo con iOS, pero también quiero cambiar los datos cargados y serializarlos en el mismo archivo nuevamente. En Unity Editor (Windows) funciona perfectamente, pero cuando lo pruebo en un dispositivo con iOS parece que puedo leer desde StreamingAssets usando la clase WWW, pero no puedo escribir en él. También he descubierto que puedo leer y escribir en la ruta creada por Application.persistentDataPath. Pero parece que la ubicación en algún lugar del dispositivo y no puedo poner mi xml en esa ubicación y los usuarios tienen acceso a esa carpeta, por lo que no es una buena solución, ¿no?

Aquí el código que uso para cargar y guardar los datos.

using UnityEngine; using UnityEngine.UI; using System.Collections; using System.Collections.Generic; using System.Xml.Serialization; using System.IO; using System.Xml; public class testxml : MonoBehaviour { public Text result; public InputField firstPart, secondPart; public Toggle toggle; private List<int> listToSave; // Use this for initialization void Start () { listToSave = new List<int>(); } public void Save() { Serialize(); } public void Load() { StartCoroutine(Deserialize()); } private void Serialize() { string path = GetPath(); try { Debug.Log("trying to save"); var serializer = new XmlSerializer(typeof(List<int>)); using (var fs = new FileStream(path, FileMode.OpenOrCreate)) { serializer.Serialize(fs, listToSave); } } catch (XmlException e) { result.text = "error"; Debug.LogError(path + " with " + (toggle.isOn ? "persistent data path" : "data path")); Debug.LogError("xml exc while des file : " + e.Message); } catch (System.Exception e) { result.text = "error"; Debug.LogError("exc while des file : " + e.Message); Debug.LogError(path + " with " + (toggle.isOn ? "persistent data path" : "data path")); System.Exception exc = e.InnerException; int i = 0; while (exc != null) { Debug.Log("inner " + i + ": " + exc.Message); i++; exc = exc.InnerException; } } } private IEnumerator Deserialize() { Debug.Log("trying to load"); string path = GetPath(); var www = new WWW(path); yield return www; if (www.isDone && string.IsNullOrEmpty(www.error)) { try { var serializer = new XmlSerializer(typeof(List<int>)); MemoryStream ms = new MemoryStream(www.bytes); listToSave = serializer.Deserialize(ms) as List<int>; ms.Close(); result.text += "Done/n"; foreach (var i in listToSave) result.text += i + "/n"; } catch (XmlException e) { result.text = "error"; Debug.LogError(path + " with " + (toggle.isOn?"persistent data path":"data path")); Debug.LogError("xml exc while des file : " + e.Message); } catch (System.Exception e) { result.text = "error"; Debug.LogError("exc while des file : " + e.Message); Debug.LogError(path + " with " + (toggle.isOn ? "persistent data path" : "data path")); System.Exception exc = e.InnerException; int i = 0; while(exc!=null) { Debug.Log("inner "+i+": " + exc.Message); i++; exc = exc.InnerException; } } yield break; } else { Debug.LogError("www exc while des file " + www.error); Debug.LogError(path + " with " + (toggle.isOn ? "persistent data path" : "data path")); yield break; } } private string GetPath() { string path = firstPart.text; if (toggle.isOn) { path += Application.persistentDataPath; } else path += Application.dataPath; path += secondPart.text; return path; } }


"Quiero poner mi archivo xml en esta carpeta y luego leerlo. Es como la información predeterminada para el juego"

fácil, solo ponlo en tus activos. ir así ...

public TextAsset myXMLFile;

en Inspector arrastre el archivo allí. Ya terminaste

"pero luego también quiero cambiar ese archivo y guardarlo"

Lo suficientemente justo. Lo que tienes que hacer es

(1) hacer una ruta p = Application.persistentDataPath + "values.txt"

(2) el programa se inicia.

(3) compruebe si existe "p". Si es así, léalo y vaya a (6)

(4) SI NO, lea el textasset y guárdelo en "p"

(5) ir al punto (3)

(6) has terminado.

Es la única forma de hacerlo. Este es de hecho el procedimiento normal en Unity, lo haces en cada aplicación de Unity. ¡No hay otra manera!