如何反序列化此 XML 文档?

How to deserialize this XML document?

如何使用 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 数据从未成功读取,因此数组不包含任何数据。我是不是在设置数据、热点和属性方面做错了什么类?

非常感谢您的帮助!

肖恩

在你的 XML 你有

<alpha>???</alpha>

在你的 class

public float alphaValue;

可能会使用

public float alpha;

会起作用。

如果您使用 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;
}