Сбой десериализации XML на пустом элементе - PullRequest
5 голосов
/ 04 февраля 2010

У меня есть 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?

Спасибо -с

Ответы [ 4 ]

1 голос
/ 04 февраля 2010

Похоже, что содержимое XElement - если не null - не может быть пустым элементом XML. Другими словами, вы не сможете сериализовать этот XML в вашем примере из представления / экземпляра в памяти вашего Report класса.

0 голосов
/ 08 января 2014

Я создал следующий метод для исправления текста 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
0 голосов
/ 04 февраля 2010

Использовать IsNullable = True

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

    [XmlElement("ParameterTemplate", IsNullable=true)]
    public XElement ParameterTemplate { get; set; }
}
0 голосов
/ 04 февраля 2010

Вы можете реализовать интерфейс IXmlSerializable в своем классе отчетов и перезаписать методы ReadXml и WriteXml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...