的Xml反序列化的空元素

问题描述:

失败我有一个XML文件,类似于过的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必须是类型元素的节点,而不是类型结束元素的节点上。

我怎样才能得到这个反序列化与现有的XML?

感谢 -c

+0

出于兴趣,它正常工作,如果它是' ParameterTemplate> '? – 2010-02-04 16:46:01

+0

不,但完全删除它允许它序列化。 – CaffGeek 2010-02-04 16:57:05

+0

你想要在你的XML文件中存储一个'XElement'到底是什么?似乎有点奇怪...... – 2010-02-04 17:10:57

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

+1

这就是我得出的结论,我已经与该XML的提供者交谈以删除空元素 – CaffGeek 2010-02-04 17:21:10

+0

这看起来像是一种症状,不能正确地序列化XML中的XML第一种情况,这很可能是使用.NET 1.0 XmlSerializer完成的。为了正确地序列化'minOccurs =“0”'元素(例如XML中不应该存在的元素),你需要在类中使用'bool ParameterTemplateSpecified'元素。请参阅http://stackoverflow.com/questions/2330001/xml-serialization-render-empty-element/2541396#2541396 – 2011-03-03 09:55:09

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

使用ISNULLABLE =真

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

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

正如上面的评论中所提到的,这不*工作。 – CaffGeek 2010-02-04 19:52:00

我创建了下面的方法来修补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