2016-09-25 65 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