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