2016-09-25 111 views
0

我在解析XML文件到C#中的对象时遇到了一些问题。整个项目在Unity3D中。所以我有这个XML文件:在Unity C中解析XML文件#

<Questions> 
    <Question> 
     <questionText>What is this?</questionText> 
     <answer>blablabla</answer> 
    </Question> 
</Questions> 

这是我的解析类:

using UnityEngine; 
using System.Collections.Generic; 
using System.Xml; 
using System.Xml.Serialization; 
using System.IO; 
using System; 

public struct Montage { 
    [XmlElement("questionText")] 
    public string questionText; 

    [XmlElement("answer")] 
    public string answer; 
} 

[XmlRoot("Questions"), XmlType("Questions")] 
public class ConfigScene { 

    [XmlArray("Questions")] 
    [XmlArrayItem("Question")] 
    public List<Montage> questions = new List<Montage>(); 

    public static ConfigScene Load(string path) { 
     try { 
      XmlSerializer serializer = new XmlSerializer (typeof(ConfigScene)); 
      using(FileStream stream = new FileStream(path, FileMode.Open)) { 
       return serializer.Deserialize(stream) as ConfigScene; 
      } 
     } catch (Exception e) { 
      UnityEngine.Debug.LogError ("Exception loading config file: " + e); 

      return null; 
     } 
    } 
} 

我打电话相机对象本 “装载” 方法开始()方法:

void Start() { 
    confScene = ConfigScene.Load(Path.Combine(Application.dataPath, "Config/config2.xml")); 
    foreach(Montage o in confScene.questions) { 
     Debug.Log (o.questionText); 
    } 
} 

问题是我的问题列表是空的,我没有得到任何提供的数据。我做错了什么?也许有人以前做过,并知道这段代码有什么问题?

+1

首先确保您的文件路径正常。这就是文件__config2.xml__存在于路径Application.dataPath +“Config /”中。你可以在方法'Start()'012h中打印路径。其次确保你没有在方法'Load()'中得到异常。异常不会从那里重新抛出。您应该检查Unity应用程序日志。 –

+0

正如我看到的路径是好的,但当我记录整个路径组合,我得到这样的东西:“F:/ Unity项目/蒙太奇游戏/资产\配置/ config2.xml”。正如你看到的斜线之一是反斜杠(Config之前)。这是一个错误还是什么? – Celdur

+0

这条路显然是错的。你不能混淆向前和向后的斜杠。如果你在Windows上,所有的应该是反斜杠,而在基于Unix的系统上则应该是反斜杠。现在,您可以手动连接路径来检查,而不是使用'Path.Combine()'。什么是您的操作系统,BTW? –

回答

1

XML文件架构(config2.xml)和相应类中的XML序列化属性不匹配。您的XML文档的根元素(Questions)和问题列表元素是冲突的。

更改XmlRootElementName(即现在问题,在代码中第16行)到别的东西(比如)。相应地更改config2.xml文件内容:将整个文档括在一个Root元素中,如下所示。

<Root> 
    <Questions> 
    <Question> 
     <questionText>What is this?</questionText> 
     <answer>blablabla</answer> 
    </Question> 
    </Questions> 
</Root> 

现在反序列化应该没问题。

0

我不得不提出一个答案,因为我想在这里添加一些代码。所以现在我可以运行它并获取数据。但是我的XML文件更加嵌套。下面是XML文件:

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

<MontageConfig> 
    <Parameters> 
     <Parameter> 
      <mainObject> 
       <name>tableTop</name> 
      </mainObject> 
      <connectors> 
       <connector> 
        <name>bolt</name> 
        <count>4</count> 
       </connector> 
       <connector> 
        <name>spike</name> 
        <count>5</count> 
       </connector> 
      </connectors> 
     </Parameter> 
    </Parameters> 
</MontageConfig> 

而我的等级:

using UnityEngine; 
using System.Collections.Generic; 
using System.Xml; 
using System.Xml.Serialization; 
using System.IO; 
using System; 

public struct Connectors { 
    [XmlElement("name")] 
    public string connectorName; 

    [XmlElement("count")] 
    public int connectorCount; 
} 

public struct Montage 
{ 
    [XmlElement("mainObject")] 
    [XmlElement("name")] 
    public string name; 

    [XmlElement("connectors")] 
    [XmlElement("connector")] 
    public List<Connectors> connectors; 

} 

[XmlRoot("MontageConfig")] 
public class ConfigScene 
{ 

    [XmlArray("Parameters")] 
    [XmlArrayItem("Parameter")] 
    public List<Montage> questions = new List<Montage>(); 

    public static ConfigScene Load(string path) 
    { 
     try 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(ConfigScene)); 
      using (FileStream stream = new FileStream(path, FileMode.Open)) 
      { 
       //Debug.Log(serializer.Deserialize(stream) as ConfigScene); 
       return serializer.Deserialize(stream) as ConfigScene; 
      } 
     } 
     catch (Exception e) 
     { 
      UnityEngine.Debug.LogError("Exception loading config file: " + e); 

      return null; 
     } 
    } 
} 

问题是与连接器。我想我没有做好。所以我无法获得任何数据到这个连接器对象。你知道如何解决这个问题吗?

+0

我只是遵循这个描述:https://msdn.microsoft.com/en-us/library/58a18dwa(v=vs.110).aspx 现在一切正常! – Celdur