2017-03-31 83 views
2

我目前在unity3D中制作游戏。我有一个xml文档,其中包含许多用各种纸牌填充的套牌。该XML文件看起来是这样的:在c#中反序列化嵌套的xml(Unity-script)

<?xml version="1.0" encoding="utf-8" ?> 
<CardCollection> 
    <Cards> 
    <Deck DeckId="1"> 
     <Card Id="1"> 
     <CardElement1></CardElement1> 
     <CardElement2></CardElement2> 
     </Card> 
     <Card Id="2"> 
     <CardElement1></CardElement1> 
     <CardElement2></CardElement2> 
     </Card> 
     <Card Id="3"> 
     <CardElement1></CardElement1> 
     <CardElement2></CardElement2> 
     </Card> 
    </Deck> 
    <Deck DeckId="2"> 
     <Card Id="1"> 
     <CardElement1></CardElement1> 
     <CardElement2></CardElement2> 
     </Card> 
    </Deck> 
    </Cards> 
</CardCollection> 

我有一个类Card.cs看起来像下面这样:

using System.Xml.Serialization; 

public class Card { 

    [XmlAttribute("Id")] 
    public int id; 

    [XmlElement("CardElement1")] 
    public string cardElement1; 

    [XmlElement("CardElement2")] 
    public string cardElement2; 
} 

和A类Deck.cs:

使用系统。 Xml.Serialization;

public class Deck { 

    [XmlAttribute("DeckId")] 
    public int deckId; 

    [XmlArray("Card")] 
    public Card[] cards; 
} 

我使用了一个名为CardContainer类来填充这个信息的列表甲板:

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

[XmlRoot("CardCollection")] 
public class CardContainer { 

    [XmlArray("Cards")] 
    [XmlArrayItem("Deck")] 
    public List<Deck> decks = new List<Deck>(); 

    public static CardContainer Load(string path) 
    { 
     TextAsset xml = Resources.Load<TextAsset>(path); 

     XmlSerializer serializer = new XmlSerializer(typeof(CardContainer)); 

     StringReader reader = new StringReader(xml.text); 

     CardContainer cards = serializer.Deserialize(reader) as CardContainer; 

     reader.Close(); 

     return cards; 
    } 

} 

我可以用这个代码片段甲板的ID用的保持:

CardContainer cardContainer = CardContainer.Load(path); 
foreach(Deck deck in cardContainer.decks){ 
     Debug.Log(deck.deckId); 
} 

但是,我不知道如何反序列化和填充Deck对象中的Card-array。

回答

0

我解决它通过改变甲板类为以下内容:

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

public class Deck { 

    [XmlAttribute("DeckId")] 
    public int deckId; 

    [XmlElement("Card")] 
    public List<Card> cards = new List<Card>(); 
}