将XML从流反序列化到List <t>

时间:2018-05-21 00:30:58

标签: c# xml xml-parsing xml-deserialization

我在XML文件中有一些数据正在通过流读取。我有权访问流对象,我必须使用它反序列化数据并填充List。我的模型类在下面给出

[XmlRoot("invoices")]
public class Invoice
{       
    [XmlElement(ElementName = "description", IsNullable= true)]
    public string Description { get; set; }

    [XmlElement(ElementName = "invoice_date")]
    public string InvoiceDate { get; set; }

    [XmlElement(ElementName = "invoice_number")]
    public string InvoiceNumber { get; set; }

    [XmlElement(ElementName = "date_due")]
    public string DateDue { get; set; }

    [XmlElement(ElementName = "amount")]
    public string Amount { get; set; }
}

以下是我用来读取数据的方法的片段

public List<Invoice> ParseRecords(Stream stream)
    {
        List<Invoice> invoices = new List<Invoice>();

        try
        {
            stream.Position = 0;
            XmlSerializer serializer = new XmlSerializer(typeof(List<Invoice>));
            invoices = (List<Invoice>)serializer.Deserialize(stream);
        }
        catch (Exception ex)
        {
            log.Error(ex);
        }

        return invoices;
    }

XML数据包含带有名为“发票”的根标签的发票和带有“发票”标签的多个子记录。没有为根元素定义名称空间,因为从外部源接收XML数据,所以无法完成。 XML数据格式正确。我面临的问题是,当执行Deserialize()方法时,它会抛出一个异常说 XML文档中存在错误(2,2)。 内部异常说{“不是预期的。”}

有人可以帮我弄清楚这里有什么问题吗?

2 个答案:

答案 0 :(得分:3)

实现预期结果的一种方法如下

[XmlRoot(ElementName = "invoices")]
public class Invoices
{
    [XmlElement(ElementName = "invoice")]
    public List<Invoice> Invoice { get; set; }
}

    [XmlRoot("invoice")]
public class Invoice
{
    [XmlElement(ElementName = "description", IsNullable = true)]
    public string Description { get; set; }

    [XmlElement(ElementName = "invoice_date")]
    public string InvoiceDate { get; set; }

    [XmlElement(ElementName = "invoice_number")]
    public string InvoiceNumber { get; set; }

    [XmlElement(ElementName = "date_due")]
    public string DateDue { get; set; }

    [XmlElement(ElementName = "amount")]
    public string Amount { get; set; }
}

你的解析记录功能应该像下面的

public Invoices ParseRecords(Stream stream)
{
    Invoices invoices;

    try
    {
        stream.Position = 0;
        XmlSerializer serializer = new XmlSerializer(typeof(Invoices);
        invoices = (Invoices)serializer.Deserialize(stream);
    }
    catch (Exception ex)
    {
        log.Error(ex);
    }

    return invoices;
}

答案 1 :(得分:0)

数据中有一些不可见的代码(看起来像空格),它可能是由编码引起的。