简体   繁体   English

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

[英]Deserialize an XML file - an error in xml document (1,2)

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. 。我已经搜索了计算器论坛上,谷歌和实施的意见,但我仍然得到同样的错误,请查找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()
    {

    }
}

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

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!");
}

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM