如何反序列化这个XML文档?

时间:2015-10-28 23:03:16

标签: c# xml xmlserializer xml-deserialization

如何使用C#XmlSerializer反序列化此XML文档结构?

...
<Data>
    <Hotspot>
        <Properties>
            <xPos>0.5</xPos>
            <yPos>0.3</yPos>
            <alpha>0.1</alpha>
        </Properties>
        <Properties>
            <xPos>0.4</xPos>
            <yPos>0.7</yPos>
            <alpha>0.2</alpha>
        </Properties>
    </Hotspot>
    <Hotspot>
        <Properties>
            <xPos>0.1</xPos>
            <yPos>0.2</yPos>
            <alpha>0.9</alpha>
        </Properties>
        <Properties>
            <xPos>0.2</xPos>
            <yPos>0.3</yPos>
            <alpha>0.8</alpha>
        </Properties>
    </Hotspot>
</Data>

我在Unity工作,我想用这个XML文档中的位置数据驱动一个GUI元素。

以下是我的反序列化代码:

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

public class Data
{
    public List<Hotspot> Hotspot;

    [XmlIgnore]
    public Data XmlData;

    public void Deserialize()
    {
        XmlSerializer deserializer = new XmlSerializer(typeof(Data));
        TextReader reader = new StreamReader(@"D:\Unity Projects\Axion800_Kabine\Assets\hspositions.xml");
        object obj = deserializer.Deserialize(reader);

        XmlData = (Data)obj;
        reader.Close ();
    }
}

public class Hotspot
{
    public List<Properties> Properties = new List<Properties>();
}

public class Properties
{
    public float xPos;
    public float yPos;

    public float alphaValue;
}

仅出于测试目的,我制作了另一个脚本来实际使用XML数据并将其附加到GUI元素:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class UseXMLData : MonoBehaviour 
{
    private RectTransform rectTrans;
    private int _index = 0;

    private Data data;

    void Awake () 
    {
        data = new Data();
        data.Deserialize();
        rectTrans = GetComponent<RectTransform>();
    }

    void Update () 
    {
        rectTrans.anchoredPosition = new Vector2(data.XmlData.Hotspot[0].Properties[_index].xPos, data.XmlData.Hotspot[0].Properties[_index].yPos);
        _index++;

        if(_index == data.XmlData.Hotspot[0].Properties.Count - 1)
            _index = 0;
    }
}

这是我收到的错误消息:

ArgumentOutOfRangeException: Argument is out of range.
Parameter name: index
System.Collections.Generic.List`1[Properties].get_Item (Int32 index) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections.Generic/List.cs:633)
UseXMLData.Update () (at Assets/UseXMLData.cs:21)

在我看来,XML数据从未成功读取,因此数组不包含数据。我是如何设置数据,热点和属性类的?

非常感谢您的帮助!

肖恩

2 个答案:

答案 0 :(得分:1)

如果使用XmlElement属性修饰Hotspot和Properties集合,则反序列化工作正常:

public class Data
{
    [XmlElement("Hotspot")]
    public List<Hotspot> Hotspot;

    [XmlIgnore]
    public Data XmlData;

    public void Deserialize()
    {
        XmlSerializer deserializer = new XmlSerializer(typeof(Data));
        TextReader reader = new StreamReader(@"XMLFile1.xml");
        object obj = deserializer.Deserialize(reader);

        XmlData = (Data)obj;
        reader.Close();
    }
}

public class Hotspot
{
    [XmlElement("Properties")]
    public List<Properties> Properties = new List<Properties>();
}

public class Properties
{
    public float xPos;
    public float yPos;

    [XmlElement("alpha")]
    public float alphaValue;
}

答案 1 :(得分:0)

在您的XML中

<alpha>???</alpha>

并在你的班级

public float alphaValue;

也许正在使用

public float alpha;

会奏效。