2010-02-04 126 views
5

失敗我有一個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

出於興趣,它正常工作,如果它是' '? – 2010-02-04 16:46:01

+0

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

+0

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

回答

1

它看起來像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

0

您可以在報表類上實現IXmlSerializable接口並覆蓋ReadXml和WriteXml方法。

0

使用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

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