反序列化XML对象。字段未初始化

问题描述 投票:0回答:1

存在一个问题,对象字段被初始化为空。

我检查了两个示例,设置了字段注释,但似乎做错了。

所以这是我的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

任何人都可以建议为什么会这样吗?

c# xmlserializer
1个回答
2
投票

您的对象有一些问题。您试图获取属性来代替元素,并且您的数组不是数组,它们只是复杂的元素。以下是与您的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 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 FastenerProperty FastenerProperty { 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
}
© www.soinside.com 2019 - 2024. All rights reserved.