Десериализация XML из потока в список <T> - PullRequest
0 голосов
/ 21 мая 2018

У меня есть некоторые данные в файле XML, который читается через поток.У меня есть доступ к объекту потока, с помощью которого я должен десериализовать данные и заполнить список.Класс моей модели приведен ниже

[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 голосов
/ 21 мая 2018

в данных есть какой-то невидимый код (выглядит как пробел), возможно, это вызвано кодировкой.

0 голосов
/ 21 мая 2018

Один из способов достижения ожидаемого результата выглядит следующим образом:

[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;
}
...