简体   繁体   English

如何反序列化此XML文档?

[英]How to deserialize this XML document?

How do I deserialize this XML document structure with the C# XmlSerializer? 如何使用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>

I'm working in Unity and I want to drive a GUI element with the position data in this XML document. 我在Unity中工作,我想用此XML文档中的位置数据来驱动GUI元素。

Here is my code for deserializing: 这是我反序列化的代码:

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;
}

Just for testing purposes I made another script to actually use the XML data and attached it to a GUI element: 仅出于测试目的,我制作了另一个脚本来实际使用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;
    }
}

This is the error message I receive: 这是我收到的错误消息:

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)

Looks to me like the XML data was never successfully read, so that the arrays contain no data. 在我看来,从未成功读取XML数据,因此数组不包含任何数据。 Have I done something wrong in how I set up the Data, Hotspot and Properties classes? 在设置Data,Hotspot和Properties类时,我做错了什么吗?

Many thanks for any help! 非常感谢您的帮助!

Sean 肖恩

If you decorate Hotspot and Properties collections with XmlElement attribute as below deserialization works fine: 如果您使用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;
}

In your XML you have 在您的XML中

<alpha>???</alpha>

and in your class 在你班上

public float alphaValue;

maybe using 也许使用

public float alpha;

will work. 将工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM