首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XmlException:根元素丢失。我正在使用教程创建xml加载和保存系统,但我不知道错误在哪里

XmlException:根元素丢失。我正在使用教程创建xml加载和保存系统,但我不知道错误在哪里
EN

Stack Overflow用户
提问于 2022-08-19 19:37:09
回答 1查看 100关注 0票数 0

以下是错误消息:

代码语言:javascript
运行
复制
XmlException: Root element is missing.
System.Xml.XmlTextReaderImpl.Throw (System.Exception e) (at <3df1727680a4410c8922c5d71cde3a04>:0)
System.Xml.XmlTextReaderImpl.ThrowWithoutLineInfo (System.String res) (at <3df1727680a4410c8922c5d71cde3a04>:0)
System.Xml.XmlTextReaderImpl.ParseDocumentContent () (at <3df1727680a4410c8922c5d71cde3a04>:0)
System.Xml.XmlTextReaderImpl.Read () (at <3df1727680a4410c8922c5d71cde3a04>:0)
System.Xml.XmlTextReader.Read () (at <3df1727680a4410c8922c5d71cde3a04>:0)
System.Xml.XmlReader.MoveToContent () (at <3df1727680a4410c8922c5d71cde3a04>:0)
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderActorContainer.Read4_ActorCollection () (at <c06125c6813e448a84b3586be54913c5>:0)
System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <e40e5a8f982c4b618a930d29f9bd091c>:0)
Rethrow as InvalidOperationException: There is an error in XML document (0, 0).
System.Xml.Serialization.XmlSerializer.Deserialize (System.Xml.XmlReader xmlReader, System.String encodingStyle, System.Xml.Serialization.XmlDeserializationEvents events) (at <3df1727680a4410c8922c5d71cde3a04>:0)
System.Xml.Serialization.XmlSerializer.Deserialize (System.Xml.XmlReader xmlReader, System.String encodingStyle) (at <3df1727680a4410c8922c5d71cde3a04>:0)
System.Xml.Serialization.XmlSerializer.Deserialize (System.IO.Stream stream) (at <3df1727680a4410c8922c5d71cde3a04>:0)
GenshinImpactMovementSystem.SaveData.LoadActors (System.String path) (at Assets/GenshinImpactMovementSystem/Scripts/Characters/Player/Data/XML/SaveData.cs:54)
GenshinImpactMovementSystem.SaveData.Load (System.String path) (at Assets/GenshinImpactMovementSystem/Scripts/Characters/Player/Data/XML/SaveData.cs:19)
GenshinImpactMovementSystem.GameController+<>c.<OnEnable>b__9_1 () (at Assets/GenshinImpactMovementSystem/Scripts/Controllers/GameController.cs:76)
UnityEngine.Events.InvokableCall.Invoke () (at <4a31731933e0419ca5a995305014ad37>:0)
UnityEngine.Events.UnityEvent.Invoke () (at <4a31731933e0419ca5a995305014ad37>:0)
UnityEngine.UI.Button.Press () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/Button.cs:70)
UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/Button.cs:114)
UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:57)
UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] functor) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:272)
UnityEngine.EventSystems.EventSystem:Update() (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501)

我不确定错误是什么,但我认为这是因为xml文件是空白的,但是在本教程中,代码应该已经编写好了。有4个脚本,我正在使用创建保存和加载系统。

演员剧本:

代码语言:javascript
运行
复制
using System.Collections;
using System.Collections.Generic;
using System.Xml.Serialization;
using UnityEngine;

namespace GenshinImpactMovementSystem
{
public class Actor : MonoBehaviour
{
    public ActorData data =  new ActorData();

    public string name = "actor";

    public void StoreData()
    {
        data.name = name;
        Vector3 pos = transform.position;
        data.posX = pos.x;
        data.posY = pos.y;
        data.posZ = pos.z;
    }

    public void LoadData()
    {
        name = data.name;
        transform.position = new Vector3(data.posX, data.posY, data.posZ);
    }

    void OnEnable() 
    {
        SaveData.OnLoaded += delegate { LoadData(); };
        SaveData.OnBeforeSave += delegate { StoreData(); };
        SaveData.OnBeforeSave += delegate { SaveData.AddActorData(data); };
    }

    void OnDisable() 
    {
        SaveData.OnLoaded -= delegate { LoadData(); };
        SaveData.OnBeforeSave -= delegate { StoreData(); };
        SaveData.OnBeforeSave -= delegate { SaveData.AddActorData(data); };
    }
}

public class ActorData
{
    [XmlAttribute("Name")]
    public string name;
    
    [XmlElement("PosX")]
    public float posX;

    [XmlElement("PosY")]
    public float posY;

    [XmlElement("PosZ")]
    public float posZ;
}
}

角色容器脚本:

代码语言:javascript
运行
复制
using System.Collections;
using System.Collections.Generic;
using System.Xml.Serialization;
using UnityEngine;

namespace GenshinImpactMovementSystem
{
    [XmlRoot("ActorCollection")]
    public class ActorContainer 
    {
        [XmlArray("Actors")]
        [XmlArrayItem("Actor")]
        public List<ActorData> actors = new List<ActorData>();
    }
}

保存数据脚本:

代码语言:javascript
运行
复制
using System.Collections;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.IO;
using UnityEngine;

namespace GenshinImpactMovementSystem
{
    public class SaveData
    {
        public static ActorContainer actorContainer = new ActorContainer();

        public delegate void SerializeAction();
        public static event SerializeAction OnLoaded;
        public static event SerializeAction OnBeforeSave;

        public static void Load(string path)
        {
            actorContainer = LoadActors(path);

            foreach (ActorData data in actorContainer.actors)
            {
                GameController.CreateActor(data, GameController.playerPath, new Vector3(data.posX, data.posY, data.posZ), Quaternion.identity);
            }

            OnLoaded();
        }

        public static void Save(string path, ActorContainer actors)
        {
            OnBeforeSave();

            SaveActors(path, actors);

            ClearActors();
        }

        public static void AddActorData(ActorData data)
        {
            actorContainer.actors.Add(data);
        }

        public static void ClearActors()
        {
            actorContainer.actors.Clear();
        }

        private static ActorContainer LoadActors(string path)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(ActorContainer));

            FileStream stream = new FileStream(path, FileMode.Create);

            ActorContainer actors = serializer.Deserialize(stream) as ActorContainer;

            stream.Close();

            return actors;
        }

        private static void SaveActors(string path, ActorContainer actors)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(ActorContainer));

            FileStream stream = new FileStream(path, FileMode.Open);

            serializer.Serialize(stream, actors);

            stream.Close();
        }
    }
}

游戏控制器:

代码语言:javascript
运行
复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Cinemachine;
using TMPro;

namespace GenshinImpactMovementSystem
{
    public class GameController : MonoBehaviour
    {
        public Button saveButton;
        public Button loadButton;

        public CinemachineVirtualCamera camera;

        public const string playerPath = "Prefabs/Player";

        private static string dataPath = string.Empty;

        void Awake() 
        {
            if (Application.platform == RuntimePlatform.IPhonePlayer)
            {
                dataPath = System.IO.Path.Combine(Application.persistentDataPath, "GenshinImpactMovementSystem/Resources/actors.xml");
            }
            else
            {
                dataPath = System.IO.Path.Combine(Application.dataPath, "GenshinImpactMovementSystem/Resources/actors.xml");
            }
        }

        void Start()
        {
            CreateActor(playerPath, new Vector3(0, 0, 0), Quaternion.identity);
        }

        public static Actor CreateActor(string path, Vector3 position, Quaternion rotation)
        {
            GameObject prefab = Resources.Load<GameObject>(path);

            GameObject go = GameObject.Instantiate(prefab, position, rotation) as GameObject;

            Player playerScript = go.GetComponent<Player>();
            
            Transform cameraLookAt = playerScript.cameraPointLookAt;

            CinemachineVirtualCamera cam = FindObjectOfType<CinemachineVirtualCamera>();

            cam.Follow = cameraLookAt;
            cam.LookAt = cameraLookAt;

            playerScript.CameraRecenteringUtility.VirtualCamera = cam;

            Actor actor = go.GetComponent<Actor>() ?? go.AddComponent<Actor>();

            return actor;
        }

        public static Actor CreateActor(ActorData data, string path, Vector3 position, Quaternion rotation)
        {
            GameObject prefab = Resources.Load<GameObject>(path);

            GameObject go = GameObject.Instantiate(prefab, position, rotation);

            Actor actor = go.GetComponent<Actor>() ?? go.AddComponent<Actor>();

            actor.data = data;

            return actor;
        }

        void OnEnable()
        {
            saveButton.onClick.AddListener(delegate {SaveData.Save(dataPath, SaveData.actorContainer);});
            loadButton.onClick.AddListener(delegate {SaveData.Load(dataPath);});
        }

        void OnDisable()
        {
            saveButton.onClick.RemoveListener(delegate {SaveData.Save(dataPath, SaveData.actorContainer);});
            loadButton.onClick.RemoveListener(delegate {SaveData.Load(dataPath);});
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-19 19:54:15

XML格式良好的规则只需要一个根元素。

此示例文档有效:

代码语言:javascript
运行
复制
<doc>
  <entry>...</entry>
  <entry>...</entry>
</doc>

此示例文档无效,因为有多个顶级元素:

代码语言:javascript
运行
复制
<entry>...</entry>
<entry>...</entry>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73421527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档