2012-02-28 2 views
1

Я пытаюсь десериализовать XML-файл, который я получаю от поставщика с XmlSerializer, однако я получаю это исключение: There is an error in XML document (1, 2).InnerException Message "<delayedquotes xmlns=''> was not expected.. Я искал форум stackoverflow, google и реализовал совет, однако я все равно получаю ту же ошибку. Пожалуйста, найдите прилагаемую некоторое содержимое файла XML:Deserialize XML-файл - ошибка в XML-документе (1,2)

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

    } 
} 

ответ

2

Может быть, вы можете попробовать этот код:

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

Привет, Комыг, только что вернулся в офис. спасибо за отзыв, проверит код. –

+0

Komyg, ваш тоже хорошо работает, однако только одна запись доступна после того, как я сериализовал xml-файл. Как получить остальные записи или сериализовать xml в коллекцию. –

+0

@ LindsayFisher, я предположил, что вам нужно десериализовать более одного инструментального тега, поэтому я отредактировал свой ответ соответственно. Пожалуйста, проверьте его снова и скажите мне результат. – Felipe

2

Попробуйте этот код.

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

+1, работает как шарм. – WDRust

+0

Привет, Марко, только что вернулся в офис. спасибо за отзыв, проверит код. –

+0

Марко, попробовал ваш код, и это сработало, однако я пробовал следующее, которое я получил из учебника. Это можно сделать? XmlSerializer serializer = новый XmlSerializer (typeof (List )); Список ExchangeRates = (Список ) serializer.Deserialize (поток); –

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

Привет, Ричард, только что вернулся в офис. спасибо за отзыв, проверит код. –

+0

Ричард, я думаю, у меня проблема, но я не знаю, как ее решить. Я использовал следующий код, который я получил из учебника. Файл xml имеет несколько записей. Это можно сделать? XmlSerializer serializer = новый XmlSerializer (typeof (List )); Список ExchangeRates = (Список ) serializer.Deserialize (поток); –