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

C# 反序列化XML对象。字段未初始化,c#,xmlserializer,C#,Xmlserializer,存在一个问题,即对象字段被初始化为null 我检查了几个示例,设置了字段注释,但似乎我做错了什么 这是我的xml文件: <?xml version="1.0" encoding="UTF-8"?> <getInvoiceReply> <invoiceID value="944659502"/> <invFastener> <fastenerID value=""/> <fastene

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

我检查了几个示例,设置了字段注释,但似乎我做错了什么

这是我的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>
inv紧固件

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; }
    }
测试代码:

 InvoiceReply i = null;

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


有人能告诉我为什么会发生这种情况吗?

您的对象有一些问题。您试图用属性代替元素,而您的数组不是数组,它们只是复杂的元素。下面是一个与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
}
类程序
{
静态void Main(字符串[]参数)
{
字符串xml=@“
";
var serializer=新的XmlSerializer(typeof(InvoiceReply));
VARI=(InvoiceReply)序列化程序。反序列化(新的MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml));
Console.ReadKey();
}
}
//用于获取值属性的泛型类
公共类价值要素
{
[XmlAttribute(“值”)]
公共字符串值{get;set;}
}
[XmlRoot(“getInvoiceReply”)]
公共类发票回复
{
[XmlElement(“发票ID”)]
public ValueElement InvoiceId{get;set;}//这是一个值元素
[XmlElement(“INVnexture”)]
公共列表{get;set;}//这是一个元素,不是数组
}
公共类紧固件
{
[XmlElement(“fastenerID”)]
public ValueElement FastenerID{get;set;}//这是一个值元素
[XmlElement(“fastenerName”)]
public ValueElement FastenerName{get;set;}//这是一个值元素
[XmlElement(“fastenerCount”)]
public ValueElement FastenerCount{get;set;}//这是一个值元素
[XmlElement(“fastenerProperty”)]
public List FastenerProperties{get;set;}//这是一个元素,不是数组
}
公共类FastenerProperty
{
[XmlElement(“propID”)]
public ValueElement PropId{get;set;}//这是一个值元素
[XmlElement(“propName”)]
public ValueElement PropName{get;set;}//这是一个值元素
[XmlElement(“propValue”)]
public ValueElement PropValue{get;set;}//这是一个值元素
}

您的对象有一些问题。您试图用属性代替元素,而您的数组不是数组,它们只是复杂的元素。下面是一个与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
}
类程序
{
静态void Main(字符串[]参数)
{
字符串xml=@“
";
var serializer=新的XmlSerializer(typeof(InvoiceReply));
VARI=(InvoiceReply)序列化程序。反序列化(新的MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml));
Console.ReadKey();
}
}
//用于获取值属性的泛型类
公共类价值要素
{
[XmlAttribute(“值”)]
公共字符串值{get;set;}
}
[XmlRoot(“getInvoiceReply”)]
公共类发票回复
{
[XmlElement(“发票ID”)]
public ValueElement InvoiceId{get;set;}//这是一个值元素
[XmlElement(“INVnexture”)]
公共列表{get;set;}//这是一个元素,不是数组
}
公共类紧固件
{
[XmlElement(“fastenerID”)]
public ValueElement FastenerID{get;set;}//这是一个值元素
[XmlElement(“fastenerName”)]
public ValueElement FastenerName{get;set;}//这是一个值元素
[XmlElement(“fastenerCount”)]
public ValueElement FastenerCount{get;set;}//这是一个值元素
[XmlElement(“fastenerProperty”)]
public List FastenerProperties{get;set;}//这是一个元素,不是数组
}
公共类FastenerProperty
{
[XmlElement(“propID”)]
public ValueElement PropId{get;set;}//这是一个值元素
[XmlElement(“propName”)]
public ValueElement PropName{get;set;}//这是一个值元素
[XmlElement(“propValue”)]
public ValueElement PropValue{get;set;}//这是一个值元素
}

在您的帖子中,示例XML只有invoiceID的值。您使用的是另一个包含更多数据的示例吗?如果是这样的话,我们可以看到sample吗?xmltattribute(“fastenerID”)fastenerID是一个元素,value是属性。你有这个多个elements@CaseyCrookston我用的是同样的。可能有一些数字,没什么特别的。也许每个元素的“值”是属性的问题?也许我的等级制度错了?嗯,乍一看,我的意思是。。。没有价值。因此,我强烈猜测这就是它们最终为null的原因。@bhmahler这意味着InvoiceId应该是具有名为“Value”字段的类?在您的帖子中,示例XML只有InvoiceId的值。您使用的是另一个包含更多数据的示例吗?如果是这样的话,我们可以看到sample吗?xmltattribute(“fastenerID”)fastenerID是一个元素,value是属性。你有这个多个elements@CaseyCrookston我用的是同样的。可能有一些数字,没什么特别的。也许每个元素的“值”是属性的问题?也许我的等级制度错了?嗯,乍一看,我的意思是。。。没有价值。所以我强烈猜测,这就是它们最终为null的原因。@bhmahler这意味着InvoiceId应该是字段为“Value”的类?先生,谢谢您的帮助。我可以再问你一个问题吗?如果紧接着会有另一个标签呢?它会是可分析的吗?在源xml文件中,它们不按父标记取整。它们可能来自(0..n)它们将一个接一个地运行。只需将其保留为XmlElement,并将类型更改为list
public list Inv紧固件{get;set;}
我更新了我的答案以支持多个Inv紧固件和Mu
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
}