C# XML文档中存在错误

C# XML文档中存在错误,c#,xml,deserialization,C#,Xml,Deserialization,我正在尝试将Xml文档反序列化为对象数组。我用Xna做到了,但对于monogame,我必须改变我的方法 我就是这样反序列化的: public static XmlData[] DeserializeFromXml<XmlData>(string inputFile) { XmlSerializer s = new XmlSerializer(typeof(XmlData)); XmlData[] deserializedObject = de

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

我就是这样反序列化的:

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;
    }
我的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>
您正在尝试解码此处的文件名,而不是文件内容

试试像这样的东西

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

你可以使用这个代码

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

好的,这将适用于您的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;
}

多亏了@terrybozzio,我终于找到了一种读取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(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;
    }
公共静态列表反序列化FromXML(字符串输入文件)
{
List mydata=new List();
XmlSerializer s=新的XmlSerializer(类型(列表),新的XmlRootAttribute(“资产”);
//XmlData[]反序列化对象=默认值(XmlData[]);
//byte[]byteArray=Encoding.UTF8.GetBytes(inputFile);
//byte[]byteArray=Encoding.ASCII.GetBytes(inputfile);
//MemoryStream stream=新的MemoryStream(byteArray);
流测试=TitleContainer.OpenStream(“pets.xml”);
使用(TextReader txtReader=新的StreamReader(测试))
{
mydata=(List)s.Deserialize(txtReader);
}
返回mydata;
}

您的root用户的结束标记有一个大写的第一个字母。是因为开始标记是
Asset
(大写a)而结束标记是
Asset
这是问题中的一个打字错误,还是您的XML内容是这样的?不,单击错误,两者都是大写返回列表,并且这个XmlSerializer s=新的XmlSerializer(typeof(List))@加布森:看来你以前也问过同样的问题??我无法将文件名发送到StreamReader();那么如何解决这个问题呢?第一个参数是流而不是字符串。这就是我为什么用MemoryStream是吗?这是StreamReader的多个构造函数重载之一,您可以从中选择。我选了一个更合适的。您的评论背后有问题吗?找不到XmlTextReader,可能是因为我使用的是Monogame,但以前从未见过。只需添加库System.Xml.XmlReader或System.Xml.XmlTextReader我在
new streamreader(inputFile)行有以下消息:“无法在流中转换字符串”
我不得不取消对行的注释
Memorystream=newstreamReader()       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();
        }
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;
}
[XmlType("Item")]
public class XmlData
  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;
    }