从XML中获得c#对象的通用列表工作得很好,除非我把它放在对象列表中

本文关键字:对象 列表 非我 很好 XML 工作 | 更新日期: 2023-09-27 17:54:58

这是工作:(每个发票有许多lineitem)

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中尽可能

从XML中获得c#对象的通用列表工作得很好,除非我把它放在对象列表中

您反序列化到错误的类型-您想反序列化到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);
}