C# 反序列化 XML 文件 - xml 文档中的错误 (1,2)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9480303/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Deserialize an XML file - an error in xml document (1,2)
提问by Lindsay Fisher
I'm trying to deserialize an XML file which I receive from a vendor with XmlSerializer, however im getting this exception: There is an error in XML document (1, 2).InnerException Message "<delayedquotes xmlns=''> was not expected.. I've searched the stackoverflow forum, google and implemented the advice, however I'm still getting the same error. Please find the enclosed some content of the xml file:
我正在尝试使用 XmlSerializer 反序列化我从供应商处收到的 XML 文件,但是我收到此异常:There is an error in XML document (1, 2).InnerException Message "<delayedquotes xmlns=''> was not expected.. 我搜索了 stackoverflow 论坛,谷歌并实施了建议,但是我仍然遇到同样的错误。请找到随附的 xml 文件的一些内容:
<delayedquotes id="TestData">
<headings>
<title/>
<bid>bid</bid>
<offer>offer</offer>
<trade>trade</trade>
<close>close</close>
<b_time>b_time</b_time>
<o_time>o_time</o_time>
<time>time</time>
<hi.lo>hi.lo</hi.lo>
<perc>perc</perc>
<spot>spot</spot>
</headings>
<instrument id="Test1">
<title id="Test1">Test1</title>
<bid>0</bid>
<offer>0</offer>
<trade>0</trade>
<close>0</close>
<b_time>11:59:00</b_time>
<o_time>11:59:00</o_time>
<time>11:59:00</time>
<perc>0%</perc>
<spot>0</spot>
</instrument>
</delayedquotes>
and the code
和代码
[Serializable, XmlRoot("delayedquotes"), XmlType("delayedquotes")]
public class delayedquotes
{
[XmlElement("instrument")]
public string instrument { get; set; }
[XmlElement("title")]
public string title { get; set; }
[XmlElement("bid")]
public double bid { get; set; }
[XmlElement("spot")]
public double spot { get; set; }
[XmlElement("close")]
public double close { get; set; }
[XmlElement("b_time")]
public DateTime b_time { get; set; }
[XmlElement("o_time")]
public DateTime o_time { get; set; }
[XmlElement("time")]
public DateTime time { get; set; }
[XmlElement("hi")]
public string hi { get; set; }
[XmlElement("lo")]
public string lo { get; set; }
[XmlElement("offer")]
public double offer { get; set; }
[XmlElement("trade")]
public double trade { get; set; }
public delayedquotes()
{
}
}
采纳答案by Felipe
Maybe you can try this code:
也许你可以试试这个代码:
[Serializable, XmlRoot("delayedquotes"), XmlType("delayedquotes")]
public class DelayedQuotes
{
public DelayedQuotes()
{
instrument = new List<Instrument>();
}
[XmlElement("instrument")]
public List<Instrument> instrument { get; set; }
}
[XmlType("instrument")]
public class Instrument
{
[XmlElement("title")]
public string title { get; set; }
[XmlElement("bid")]
public double bid { get; set; }
[XmlElement("spot")]
public double spot { get; set; }
[XmlElement("close")]
public double close { get; set; }
[XmlElement("b_time")]
public DateTime b_time { get; set; }
[XmlElement("o_time")]
public DateTime o_time { get; set; }
[XmlElement("time")]
public DateTime time { get; set; }
[XmlElement("hi")]
public string hi { get; set; }
[XmlElement("lo")]
public string lo { get; set; }
[XmlElement("offer")]
public double offer { get; set; }
[XmlElement("trade")]
public double trade { get; set; }
}
Also, here is a sample code to test the classes above:
此外,这里是测试上述类的示例代码:
static void Main(string[] args)
{
Console.WriteLine("Initiating test!");
XmlSerializer serializer = new XmlSerializer(typeof(DelayedQuotes));
FileStream xmlFile = new FileStream("testXml.xml", FileMode.Open);
DelayedQuotes quotes = (DelayedQuotes) serializer.Deserialize(xmlFile);
Console.WriteLine("Finalizing test!");
}
回答by Denis Gursky
Try this code.
试试这个代码。
var xml = System.IO.File.ReadAllText("test.xml");
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
{
XmlSerializer serializer = new XmlSerializer(typeof(delayedquotes));
delayedquotes data = (delayedquotes) serializer.Deserialize(stream);
}
回答by Rich Turner
I am not sure how you're deserializing the XML text into your object, but the following worked fine for me:
我不确定您如何将 XML 文本反序列化为您的对象,但以下对我来说效果很好:
using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace XMLSerializationTest
{
[Serializable, XmlRoot("delayedquotes"), XmlType("delayedquotes")]
public class delayedquotes
{
[XmlElement("instrument")]
public string instrument { get; set; }
[XmlElement("title")]
public string title { get; set; }
[XmlElement("bid")]
public double bid { get; set; }
[XmlElement("spot")]
public double spot { get; set; }
[XmlElement("close")]
public double close { get; set; }
[XmlElement("b_time")]
public DateTime b_time { get; set; }
[XmlElement("o_time")]
public DateTime o_time { get; set; }
[XmlElement("time")]
public DateTime time { get; set; }
[XmlElement("hi")]
public string hi { get; set; }
[XmlElement("lo")]
public string lo { get; set; }
[XmlElement("offer")]
public double offer { get; set; }
[XmlElement("trade")]
public double trade { get; set; }
public delayedquotes()
{
}
}
static class Program
{
static void Main(string[] args)
{
string source = @"<delayedquotes id=""TestData"">
<headings>
<title/>
<bid>bid</bid>
<offer>offer</offer>
<trade>trade</trade>
<close>close</close>
<b_time>b_time</b_time>
<o_time>o_time</o_time>
<time>time</time>
<hi.lo>hi.lo</hi.lo>
<perc>perc</perc>
<spot>spot</spot>
</headings>
<instrument id=""Test1"">
<title id=""Test1"">Test1</title>
<bid>0</bid>
<offer>0</offer>
<trade>0</trade>
<close>0</close>
<b_time>11:59:00</b_time>
<o_time>11:59:00</o_time>
<time>11:59:00</time>
<perc>0%</perc>
<spot>0</spot>
</instrument>
</delayedquotes>
";
var buff = Encoding.ASCII.GetBytes(source);
var ms = new MemoryStream(buff);
var xs = new XmlSerializer(typeof(delayedquotes));
var o = (delayedquotes)xs.Deserialize(ms);
Console.WriteLine("Title = {0}", o.instrument);
}
}
}

