使用 list 反序列化 XML

本文关键字:反序列化 XML Object list 使用 | 更新日期: 2023-09-27 18:36:26

那里我的XMl文件:

<?xml version="1.0" encoding="utf-8" ?>
<XnaContent>
  <Asset Type="XnaCzyMap.Element[]">
    <Element>
    <id>5</id>
    <pos_x>54</pos_x>
    <pos_y>30</pos_y>
    <rot>90</rot>
  </Element>
  <Element>
    <id>5</id>
    <pos_x>54</pos_x>
    <pos_y>165</pos_y>
    <rot>90</rot>
  </Element>
  <Element>
    <id>5</id>
    <pos_x>54</pos_x>
    <pos_y>340</pos_y>
    <rot>25</rot>
  </Element>
    </Asset>
</XnaContent>

和我的班级:

public class Element
{
    [System.Xml.Serialization.XmlElement("id")]
    public int id { get; set; }
    [System.Xml.Serialization.XmlElement("pos_x")]
    public int pos_x { get; set; }
    [System.Xml.Serialization.XmlElement("pos_y")]
    public int pos_y { get; set; }
    [System.Xml.Serialization.XmlElement("rot")]
    public int rot { get; set; }
}

我想将我的XML反序列化为"元素"的集合。 当我不使用 XNA 时它有效,但它不再工作了。VS给我以下错误:Error 1 There was an error while deserializing intermediate XML. Cannot find type "XnaCzyMap.Element".

我试图将集合添加为类,但也没有工作。

  [System.Xml.Serialization.XmlRoot("XnaContent")]
    public class Elements
    {
        [XmlElement("Element")]
        public List<Element> listObjet { get; set; }
    }
使用 Xna

反序列化与不使用 Xna 有什么区别?

执行反序列化的代码:

  public void load_map(string path)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Element[]));
            StreamReader reader = new StreamReader(path);
            try
            {
                file = (Element[])serializer.Deserialize(reader);
            }
            catch (Exception e)
            {
            }
            reader.Close();
        }

当我尝试使用"元素类"时,我试图通过"元素"切换"元素[]"

使用 list<Object> 反序列化 XML

Xna 不会干扰序列化,但代码中存在小错误。

您的代码正确,但您使用的 XML 文件的格式不正确。如果对 XML 文件的预期格式有疑问,请尝试使用 XmlSerializer 的序列化方法创建预期的格式。

在这种情况下,若要执行此操作,必须像这样更改 XML 文件:

<?xml version="1.0" encoding="utf-8" ?>
<ArrayOfElement Type="XnaCzyMap.Element[]">
    <Element>
    <id>5</id>
    <pos_x>54</pos_x>
    <pos_y>30</pos_y>
    <rot>90</rot>
  </Element>
  <Element>
    <id>5</id>
    <pos_x>54</pos_x>
    <pos_y>165</pos_y>
    <rot>90</rot>
  </Element>
  <Element>
    <id>5</id>
    <pos_x>54</pos_x>
    <pos_y>340</pos_y>
    <rot>25</rot>
  </Element>
</ArrayOfElement>

请注意我是如何更改根标记的。它的名称(ArrayOfElement)对.NET很重要。

编辑:如果你想保留你的原始XML文件,那很好,但你必须改变代码中的几个错误。

  1. XmlSerializer 构造将采用 typeof(Elements) 作为参数,而不是 typeof(Element[]),并且还会相应地更改返回类型强制转换。你提到你这样做了。
  2. 将定位 listObjet 集合 [XmlElement("Element")] 附近的此属性更改为此 [XmlElement("Asset")]。此属性不表示集合成员在 XML 中的外观。它说整个集合将具有什么名称。
相关文章: