C#中具有复杂元素的Xml反序列化[重复]
Posted
技术标签:
【中文标题】C#中具有复杂元素的Xml反序列化[重复]【英文标题】:Xml Deserialization with complex elements in c# [duplicate] 【发布时间】:2013-08-26 22:12:53 【问题描述】:我在将 xml 字符串反序列化为对象时遇到了一些问题。我没有收到任何错误,但没有填充值(这些值不是null
,它们只是""
)。我查看了一些具有相同问题的问题,但这些问题通常包括没有定义 [XmlRoot]
或 [XmlElement]
的人。
这是我的一些 xml 字符串:
string xmlString = @"<results><dpv_answer value=""Y"" /><zip value=""95118-4007"" /></results>"
这是反序列化的函数:
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;
【问题讨论】:
您有一个空的catch
处理程序,您可能会收到错误但不知道?
我正在逐步使用调试器,我不会进入 catch 块。
离题评论:最好用空格而不是制表符来缩进你的代码。
你们班的[Serializable]怎么样?试试这个。
@AlexandreVicenzi 在我尝试 fcuesta 的答案后我会尝试一下
【参考方案1】:
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;
【讨论】:
【参考方案2】:您的每个元素都有您尝试从中获取值的属性。此外,属性是相同的,因此您可以使用单个类,而不是像 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 的建议将它们分开。
【讨论】:
是的,我可能会按照您的建议为Element
开设课程。然后减少了很多代码。谢谢。
@Brett 在做之前阅读我的评论。
@YairNevet 它对我来说效果很好,将所有值匹配到正确的位置。
@YairNevet Element
类不知道它是哪个元素。 StandardAddress
类做出了这种区分。
@LukeWillis 是的,你是对的。以上是关于C#中具有复杂元素的Xml反序列化[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在c#中使用具有相同名称但不同属性和结构的元素反序列化XML