反序列化XML文件 - XML文档(1,2)中的错误

4
我试图使用XmlSerializer反序列化来自供应商的XML文件,但是出现了这个异常:XML文档中有一个错误(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>

还有代码

[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()
    {

    }
}
3个回答

4
也许你可以尝试这段代码:
[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; }
}

此外,这里有一个样例代码可用于测试上述类:
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!");
}

你好Komyg,我刚回到办公室。感谢反馈,我会测试代码的。 - Lindsay Fisher
Komyg,你的工作也很好,但是在我序列化XML文件后只有一条记录可用。我该如何获取其余记录或将XML序列化为集合? - Lindsay Fisher
@LindsayFisher,我假设您需要反序列化多个仪器标签,因此我已相应地编辑了我的答案。请再次测试并告诉我结果。 - Felipe
Komyg,我尝试了修改后的代码,但我只得到了一个仪器实例,而不是一个集合。我期望列表中有13个仪器。 - Lindsay Fisher
Komyg,我也试过这个 [XmlElement("instrument")] public Instrument instrument { get; set; } [XmlArray] [XmlArrayItem(ElementName = "instrument")] public List<Instrument> Instruments { get; set; } - Lindsay Fisher
显示剩余4条评论

3
尝试使用这段代码。
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);
}

你好,Marco。我刚回到办公室。谢谢你的反馈,我会测试代码的。 - Lindsay Fisher
Marco,我试了你的代码,它可以运行。但是,我尝试了下面这段代码,是从教程中学来的。这个可行吗?XmlSerializer serializer = new XmlSerializer(typeof(List<delayedquotes>)); List<delayedquotes> ExchangeRates = (List<delayedquotes>)serializer.Deserialize(stream); - Lindsay Fisher

0

我不确定您是如何将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);
        }
    }
}

你好 Richard,我刚回到办公室。谢谢你的反馈,我会测试代码的。 - Lindsay Fisher
Richard,我想我找到了问题所在,但我不知道该怎么解决。我使用的是从教程中得到的以下代码。XML 文件有多条记录,这能行吗?XmlSerializer serializer = new XmlSerializer(typeof(List<delayedquotes>)); List<delayedquotes> ExchangeRates = (List<delayedquotes>)serializer.Deserialize(stream); - Lindsay Fisher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接