Получение общего списка объектов C # из XML работает нормально, за исключением случаев, когда я помещаю его в список объектов

Это работает: (каждый счет-фактура имеет много LineItems)

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 для десериализации списка счетов-фактур?

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

   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, насколько это возможно.


person Peter PitLock    schedule 10.06.2015    source источник
comment
возможный дубликат {‹user xmlns = ''› не ожидался.} Десериализация Twitter XML   -  person captainsac    schedule 10.06.2015


Ответы (1)


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

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

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

И тогда вы сможете десериализовать так:

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

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

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

person Charles Mager    schedule 10.06.2015
comment
Добавлен пример десериализации InvoiceList в OP, тогда я не получаю результатов - person Peter PitLock; 10.06.2015
comment
@PeterPitLock Я немного расширил свой ответ. - person Charles Mager; 10.06.2015
comment
Спасибо, Чарльз, я применил все, как вы сказали, но получаю InvoiceList xmlsNS = не ожидалось. Я тоже добавлю скриншот - person Peter PitLock; 10.06.2015
comment
В вашем XML нет InvoiceList, говорится Invoices. XML в вашем вопросе работает, я пробовал. Вы используете другой XML? - person Charles Mager; 10.06.2015
comment
Отлично, большое спасибо, я изменил XML с Invoices на InvoiceList, большое спасибо Charles - person Peter PitLock; 10.06.2015