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_answerzip 是复杂元素,而不仅仅是字符串。请尝试以下操作:

[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中的重复元素

如何在c#中使用具有相同名称但不同属性和结构的元素反序列化XML

在C#中序列化和反序列化之间保留xml元素的顺序

如何反序列化 C# 中只有属性的 xml 元素?

如何反序列化 C# 对象中复杂的 XML 格式并读取它以使用其值?

在 C# 中反序列化 XML [重复]