代码之家  ›  专栏  ›  技术社区  ›  CaffGeek

XML反序列化在空元素上失败

  •  5
  • CaffGeek  · 技术社区  · 15 年前

    我有一个看起来也类似的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; }
    }
    

    失败的原因是空的参数模板元素,因为如果它包含子元素,则反序列化良好。

    我怎样才能让这个工作?

    这是我的反序列化代码

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

    例外情况是

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

    我如何才能让它用现有的XML反序列化?

    谢谢 -C

    4 回复  |  直到 11 年前
        1
  •  1
  •   Wim    15 年前

    它看起来像 XElement -如果 空-不能是空XML元素。换句话说,您将无法序列化 那个 示例中的XML来自 Report 班级。

        2
  •  0
  •   Roland    15 年前

    你可以实现 IXmlSerializable 报表类上的接口,并覆盖readxml和writexml方法。

        3
  •  0
  •   sylvanaar    15 年前

    使用IsNullable=true

    [XmlType(TypeName = "Report")]
    public class Report
    {
        [XmlElement("ReportID")]
        public int ID { get; set; }
    
        [XmlElement("ParameterTemplate", IsNullable=true)]
        public XElement ParameterTemplate { get; set; }
    }
    
        4
  •  0
  •   VoteCoffee    11 年前

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