2015-06-10 2 views
0

Это работает: (каждый счет-фактура имеет много LineItems)Попадая Общий список из C# объектов XML работает нормально, за исключением того, когда я положил, что в списке объектов

public class Invoice 
{ 
    public int InvoiceId { get; set; } 

    public List<LineItem> LineItems { get; set; } 
} 

public class LineItem 
{ 
    public int LineItemId { get; set; } 
} 
string strInvoice = "<Invoice> <InvoiceId>12345</InvoiceId> <LineItems>  <LineItem>   <LineItemId>123</LineItemId>  </LineItem>  <LineItem>   <LineItemId>456</LineItemId>  </LineItem> </LineItems></Invoice>"; 

object result = new System.Xml.Serialization.XmlSerializer(typeof(Invoice)).Deserialize(new System.IO.StringReader(strInvoice)); 

Объект получает десериализован отлично.

Но теперь, я пытаюсь сделать список счетов-фактур (теперь я прилагаю текущую строку XML в <Invoices></Invoices>):

public class InvoiceList 
{ 
    public List<Invoice> Invoices { get; set; } 
} 

string strInvoices = "<Invoices><Invoice> <InvoiceId>12345</InvoiceId> <LineItems>  <LineItem>   <LineItemId>123</LineItemId>  </LineItem>  <LineItem>   <LineItemId>456</LineItemId>  </LineItem> </LineItems></Invoice></Invoices>"; 

object results = new System.Xml.Serialization.XmlSerializer(typeof(Invoice)).Deserialize(new System.IO.StringReader(strInvoices)); 

в результате:

There is an error in XML document (1, 2). 
{"<Invoices xmlns=''> was not expected."} 

Как я могу структурировать свой класс или SQL для десериализации списка счетов-фактур?

Попытка это - который берется из ответа на твиттере вопрос, который был отмечен как дубликат, я не получаю результатов:

string strInvoices = "<Invoices><Invoice> <InvoiceId>12345</InvoiceId> <LineItems>  <LineItem>   <LineItemId>123</LineItemId>  </LineItem>  <LineItem>   <LineItemId>456</LineItemId>  </LineItem> </LineItems></Invoice></Invoices>"; 
    XmlRootAttribute xRoot = new XmlRootAttribute(); 
    xRoot.ElementName = "Invoices"; 
    xRoot.IsNullable = true; 
    object results = new System.Xml.Serialization.XmlSerializer(typeof(Invoice),xRoot).Deserialize(new System.IO.StringReader(strInvoices)); 

Если я делаю это, я получаю ту же ошибку:

object results = new System.Xml.Serialization.XmlSerializer(typeof(Invoice),xRoot).Deserialize(new System.IO.StringReader(strInvoices)); 

Если я сделаю это, как комментарий предложил, ничего не возвращается:

object results = new System.Xml.Serialization.XmlSerializer(typeof(InvoiceList),xRoot).Deserialize(new System.IO.StringReader(strInvoices)); 

Таким образом, разные к примеру, отмеченному как дубликат . Я предпринял много усилий, чтобы дублировать эту ошибку и сделать ее максимально универсальной и легко читаемой и скопированной и вставляемой в Visual Studio.

+0

Возможный дубликат [{"<пользователь xmlns = ''> не ожидался.} Дезабилизация Twitter XML] (http://stackoverflow.com/questions/1556874/user-xmlns-was-not-expected-deserializing- twitter-xml) – captainsac

ответ

2

Вы десериализируете неправильный тип - вы хотите десериализировать до InvoiceList.

Вы также должны добавить некоторые атрибуты в InvoiceList класс, чтобы правильно отобразить имена элементов:

[XmlRoot("Invoices")] 
public class InvoiceList 
{ 
    [XmlElement("Invoice")] 
    public List<Invoice> Invoices { get; set; } 
} 

И тогда вы должны быть в состоянии deserialise так:

var serializer = new XmlSerializer(typeof(InvoiceList)); 

using (var reader = new StringReader(strInvoices)) 
{ 
    var list = (InvoiceList)serializer.Deserialize(reader); 
} 

См https://dotnetfiddle.net/mBtPSP для рабочий пример.

+0

Добавлен пример десериализации InvoiceList в OP, я тогда не получаю никаких результатов –

+0

@PeterPitLock Я немного расширил свой ответ –

+0

Спасибо, Charles, я применил все, как вы сказали, но я получаю «InvoiceList xmlsNS = не ожидалось ". Я также добавлю скриншот –

 Смежные вопросы

  • Нет связанных вопросов^_^