使用c#进行复杂元素的Xml反序列化
使用c#进行复杂元素的Xml反序列化
这个问题已经有了解决方法:
我在将我的XML字符串反序列化为对象时遇到了一些麻烦。我没有收到任何错误消息,但是值没有填充(值不是null
,而只是\"\"
)。我看了一些类似问题的解决方案,但通常是因为人们没有定义[XmlRoot]
或[XmlElement]
。
下面介绍一点我的XML字符串:
string xmlString = @""
下面是反序列化函数:
StandardAddress address = new StandardAddress(); using (XmlReader reader = XmlReader.Create(new StringReader(xml))) { try { address = (StandardAddress)new XmlSerializer(typeof(StandardAddress)).Deserialize(reader); } catch (InvalidOperationException x) { // String passed is not XML, simply return defaultXmlClass } } return address;
下面是对象声明的一部分:
[XmlRoot("results")] public class StandardAddress { [XmlElement(ElementName = "dpv_answer")] public string dpv_answer { get; set; } [XmlElement(ElementName = "zip")] public string zip { get; set; } }
admin 更改状态以发布 2023年5月19日
每个元素都有属性,您正在尝试从中获取值。此外,属性是相同的,因此,像fcuesta建议的那样使用多个可序列化类不如使用单个类:
[XmlRoot("results")] public class StandardAddress { [XmlElement(ElementName = "dpv_answer")] public Element DpvAnswer { get; set; } [XmlElement(ElementName = "zip")] public Element Zip { get; set; } } public class Element { [XmlAttribute("value")] public string Value { get; set; } }
这对于相似的元素可以很有用。但是,如果您打算将元素更改为其自己的唯一模式,则它们需要分开,如fcuesta建议的那样。
dpv_answer
和zip
是复杂的元素,而不仅仅是字符串。请尝试以下操作:
[XmlRoot("results")] public class StandardAddress { [XmlElement(ElementName = "dpv_answer")] public dpv_answer dpv_answer { get; set; } [XmlElement(ElementName = "zip")] public zip zip { get; set; } } public class dpv_answer { [XmlAttribute("value")] public string Value { get; set; } } public class zip { [XmlAttribute("value")] public string Value { get; set; } }