Десериализовать объект XML. Поля не инициализированы - PullRequest
0 голосов
/ 21 октября 2019

Проблема в том, что поля объекта инициализируются как нулевые.

Я проверил пару примеров, я установил аннотации полей, но, похоже, что-то сделал не так.

Итак, вот мой xml-файл:

<?xml version="1.0" encoding="UTF-8"?>
<getInvoiceReply>
    <invoiceID value="944659502"/>
    <invFastener>
        <fastenerID value=""/>
        <fastenerName value=""/>
        <fastenerCount value=""/>
        <fastenerProperty>
            <propID value=""/>
            <propName value=""/>
            <propValue value=""/>
        </fastenerProperty>
    </invFastener>
</getInvoiceReply>

Я создал иерархию классов.

Корневой класс InvoiceReply:

 [XmlRoot("getInvoiceReply")]
    public class InvoiceReply
    {
        [XmlAttribute("invoiceID")]
        public string InvoiceId { get; set; }

        [XmlArray("invFastener")]
        public List<InvFastener> InvFastener { get; set; }
    }

класс InvFastener:

public class InvFastener
    {
        [XmlAttribute("fastenerID")]
        public string FastenerID { get; set; }

        [XmlAttribute("fastenerName")]
        public string FastenerName { get; set; }

        [XmlAttribute("fastenerCount")]
        public string FastenerCount { get; set; }

        [XmlArray("fastenerProperty")]
        public List<FastenerProperty> FastenerProperty { get; set; }
    }

класс FastenerProperty:

public class FastenerProperty
    {
        [XmlAttribute("propID")]
        public string PropId { get; set; }

        [XmlAttribute("propName")]
        public string PropName { get; set; }

        [XmlAttribute("propValue")]
        public string PropValue { get; set; }
    }

Тесткод:

 InvoiceReply i = null;

 var serializer =  new XmlSerializer(typeof(InvoiceReply));
 using (var reader = XmlReader.Create("C:\\filePathHere\\test.xml"))
     {
        i = (InvoiceReply)serializer.Deserialize(reader);      
     }

enter image description here

Может кто-нибудь подсказать, почему это происходит?

1 Ответ

2 голосов
/ 21 октября 2019

У вас есть несколько проблем с вашими объектами. Вы пытаетесь получить атрибуты вместо элементов, и ваши массивы - это не массивы, а просто сложные элементы. Ниже приведен рабочий пример, соответствующий вашей XML-схеме

class Program
{
    static void Main(string[] args)
    {
        string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
        <getInvoiceReply>
            <invoiceID value=""944659502""/>
            <invFastener>
                <fastenerID value=""""/>
                <fastenerName value=""""/>
                <fastenerCount value=""""/>
                <fastenerProperty>
                    <propID value=""""/>
                    <propName value=""""/>
                    <propValue value=""""/>
                </fastenerProperty>
            </invFastener>
        </getInvoiceReply>";



        var serializer =  new XmlSerializer(typeof(InvoiceReply));
        var i = (InvoiceReply)serializer.Deserialize(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml)));  

        Console.ReadKey();
    }
}

//Generic class for getting value attribute
public class ValueElement
{
    [XmlAttribute("value")]
    public string Value { get; set; }
}

[XmlRoot("getInvoiceReply")]
public class InvoiceReply
{
    [XmlElement("invoiceID")]
    public ValueElement InvoiceId { get; set; } //This is a value element

    [XmlElement("invFastener")]
    public List<InvFastener> InvFastener { get; set; } //This is an element, not an array
}

public class InvFastener
{
    [XmlElement("fastenerID")]
    public ValueElement FastenerID { get; set; }//This is a value element

    [XmlElement("fastenerName")]
    public ValueElement FastenerName { get; set; }//This is a value element

    [XmlElement("fastenerCount")]
    public ValueElement FastenerCount { get; set; }//This is a value element

    [XmlElement("fastenerProperty")]
    public List<FastenerProperty> FastenerProperties { get; set; } //This is an element, not an array
}

public class FastenerProperty
{
    [XmlElement("propID")]
    public ValueElement PropId { get; set; }//This is a value element

    [XmlElement("propName")]
    public ValueElement PropName { get; set; }//This is a value element

    [XmlElement("propValue")]
    public ValueElement PropValue { get; set; }//This is a value element
}
...