我有一个看起来类似的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
答案 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