空元素上的Xml反序列化失败

时间:2010-02-04 16:35:55

标签: c# xml exception serialization

我有一个看起来类似的Xml文档

<Reports xmlns="">
  <Report>
    <ReportID>1</ReportID>
    <ParameterTemplate />
  </Report>
</Reports>

无法序列化到此对象

[XmlType(TypeName = "Report")]
public class Report
{
    [XmlElement("ReportID")]
    public int ID { get; set; }

    [XmlElement("ParameterTemplate")]
    public XElement ParameterTemplate { get; set; }
}

它失败了,因为空的ParameterTemplate元素,因为如果它包含子元素,则反序列化很好。

我怎样才能让它发挥作用?

这是我的反序列化代码

var serializer = new XmlSerializer(typeof(Report));
return (Report)serializer.Deserialize(source.CreateReader());

例外是

  

XmlReader必须位于Element类型的节点上,而不是EndElement类型的节点。

如何使用现有的xml进行反序列化?

由于 -c

4 个答案:

答案 0 :(得分:1)

看起来XElement的内容 - 如果 null - 不能是空的XML元素。换句话说,您将无法从Report类的内存表示/实例序列化示例中的 XML。

答案 1 :(得分:0)

您可以在报表类上实现IXmlSerializable接口,并覆盖ReadXml和WriteXml方法。

答案 2 :(得分:0)

使用IsNullable = True

[XmlType(TypeName = "Report")]
public class Report
{
    [XmlElement("ReportID")]
    public int ID { get; set; }

    [XmlElement("ParameterTemplate", IsNullable=true)]
    public XElement ParameterTemplate { get; set; }
}

答案 3 :(得分:0)

我创建了以下方法来修补XML文本:

Public Function XMLReaderPatch(rawXML As String) As String
    If String.IsNullOrEmpty(rawXML) Then Return rawXML

     'Pattern for finding items similar to <name*/> where * may represent whitespace followed by text and/or whitespace
     Dim pattern As String = "<(\S+)(\s[^<|>]*)?/>"
     'Pattern for replacing with items similar to <name*></name> where * may represent whitespace followed by text and/or whitespace
     Dim replacement As String = "<$1$2></$1>"
     Dim rgx As New Text.RegularExpressions.Regex(pattern)

     Return rgx.Replace(rawXML, replacement)
 End Function