【问题标题】:Error in XML document [duplicate]XML 文档中的错误 [重复]
【发布时间】:2013-12-16 17:27:02
【问题描述】:

我正在尝试将 Xml 文档反序列化为对象数组。我用 Xna 做到了,但对于单人游戏,我必须改变我的方法。

这就是我反序列化的方式:

public static XmlData[] DeserializeFromXml<XmlData>(string inputFile)

    {
        XmlSerializer s = new XmlSerializer(typeof(XmlData));
        XmlData[] deserializedObject = default(XmlData[]);
        byte[] byteArray = Encoding.UTF8.GetBytes(inputFile);
        //byte[] byteArray = Encoding.ASCII.GetBytes(contents);
        MemoryStream stream = new MemoryStream(byteArray);
        using (TextReader textReader = new StreamReader(stream))
        {
            deserializedObject = (XmlData[])s.Deserialize(textReader);
        }

        return deserializedObject;
    }

我的班级 XmlData:

public class XmlData
{
    public int id;
    public int posx;
    public int posy;
    public int rot;
    public int Width;
    public int Height;
}

我的 xml 文件:

<?xml version="1.0" encoding="utf-8" ?>
  <Asset Type="XmlData[]">
    <Item>
      <id>17</id>
      <posx>54</posx>
      <posy>30</posy>
      <rot>90</rot>
      <Width>184</Width>
      <Height>5</Height>
    </Item>
  <Item>
      <id>1</id>
      <posx>200</posx>
      <posy>120</posy>
      <rot>0</rot>
      <Width>100</Width>
      <Height>90</Height>
    </Item>
</Asset>

我有以下错误:

There is an error in XML document (1, 1). (i'm using monogame)

【问题讨论】:

  • 你的根的结束标签有一个首字母小写。
  • 开始标签是Asset(带有大写A)和结束标签asset是问题中的错字,还是您的XML内容是这样的?
  • 无误点击,都是大写
  • 尝试返回 List 和这个 XmlSerializer s = new XmlSerializer(typeof(List));
  • @Gabson:看来你在Can't Load asset as XML file 之前问过同样的问题??

标签: c# xml deserialization


【解决方案1】:
Encoding.UTF8.GetBytes(inputFile);

您试图在此处解码文件名而不是文件内容。

试试类似的东西

using (StreamReader reader = StreamReader(inputFile,Encoding.UTF8,true)) 
{
    XmlSerializer serializer = new XmlSerializer(typeof(XmlData));
    return (XmlData[])serializer.Deserialize(reader);
}

【讨论】:

  • 我无法将文件名发送到 StreamReader();那么如何解决呢?
  • 第一个参数是流而不是字符串。这就是我使用 MemoryStream 的原因
  • 是吗?这是您可以选择的 StreamReader 的多个构造函数重载之一。我拿了一个更合适的。你的评论有问题吗?
【解决方案2】:

好的,这将适用于您的 xml 文件:

public static List<XmlData> DeserializeFromXml(string inputFile)
{
     List<XmlData> mydata = new List<XmlData>();
     XmlSerializer s = new XmlSerializer(typeof(List<XmlData>),new XmlRootAttribute("Asset"));
     //XmlData[] deserializedObject = default(XmlData[]);
     //byte[] byteArray = Encoding.UTF8.GetBytes(inputFile);
     //byte[] byteArray = Encoding.ASCII.GetBytes(contents);
     //MemoryStream stream = new MemoryStream(byteArray);
     using (TextReader txtReader = new StreamReader(inputFile))
     {
        mydata = (List<XmlData>)s.Deserialize(txtReader);
     }

     return mydata;
}

&lt;Item&gt; 更改为 &lt;XmlData&gt; 就可以了,或者,将其放在您的 XmlData 类声明中:

[XmlType("Item")]
public class XmlData

【讨论】:

  • 我收到以下消息:new streamreader(inputFile) 行中的“无法在流中转换字符串”
  • 我不得不取消注释行 Memorystream = new streamreader(); 但我想我尝试反序列化 hte 字符串。我认为构造函数 streamReader(string) 不是由我的框架处理的。如果你能帮我解决这个问题。谢谢
【解决方案3】:

您可以使用此代码!

       using (XmlTextReader xmlReader = new XmlTextReader(yourfile))
        {
            XDocument xdoc = XDocument.Load(xmlReader);
            var programs= from programItem in xdoc.Root.Elements()
                          select new xmldata {
                Id  = Convert.ToInt32( programItem.Attribute("Id").Value),
                posx  = Convert.ToInt32(   programItem.Attribute("posx").Value),
                poxy = Convert.ToInt32( programItem.Attribute("poxy").Value),
            };

            result = programs.ToList();
        }

【讨论】:

  • 找不到 XmlTextReader,可能是因为我正在使用 Monogame 但以前从未见过。
  • 只需要添加库 System.Xml.XmlReader 或 System.Xml.XmlTextReader
【解决方案4】:

感谢@terrybozzio,在我不得不将其转换为流之前,我终于找到了一种读取我的 xml 文件的方法。但是对于 Monogame 框架,并非所有方法都可以实现。

方法:

  public static List<XmlData> DeserializeFromXml(string inputFile)
    {
        List<XmlData> mydata = new List<XmlData>();
        XmlSerializer s = new XmlSerializer(typeof(List<XmlData>), new XmlRootAttribute("Asset"));
        //XmlData[] deserializedObject = default(XmlData[]);
       // byte[] byteArray = Encoding.UTF8.GetBytes(inputFile);
     //   byte[] byteArray = Encoding.ASCII.GetBytes(inputfile);
       // MemoryStream stream = new MemoryStream(byteArray);

        Stream test = TitleContainer.OpenStream("pets.xml");
        using (TextReader txtReader = new StreamReader(test))
        {
            mydata = (List<XmlData>)s.Deserialize(txtReader);
        }

        return mydata;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多