Это работает: (каждый счет-фактура имеет много 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, насколько это возможно.