C# XML文档中存在错误
我正在尝试将Xml文档反序列化为对象数组。我用Xna做到了,但对于monogame,我必须改变我的方法 我就是这样反序列化的: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
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()但是我想我尝试反序列化这个字符串。我认为构造函数streamReader(string)不是由我的框架处理的。如果你能帮我解决这个问题。谢谢
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;
}