2010-02-04 29 views
5

tengo un documento XML que se parece demasiadoXML Deserialización falla en elemento vacío

<Reports xmlns=""> 
    <Report> 
    <ReportID>1</ReportID> 
    <ParameterTemplate /> 
    </Report> 
</Reports> 

fracasa la serialización a este objeto

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

    [XmlElement("ParameterTemplate")] 
    public XElement ParameterTemplate { get; set; } 
} 

está fallando debido a que el elemento de ParameterTemplate vacío, porque si contiene elementos infantiles deserializa bien.

¿Cómo puedo hacer que funcione?

Ésta es mi Código Deserialización

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

La excepción es

El XmlReader debe estar en un nodo de tipo de elemento en lugar de un nodo de tipo EndElement.

¿Cómo puedo hacer para deserializar con el xml existente?

Gracias -c

+0

Como curiosidad, ¿funciona bien si es ' ¿? –

+0

No, pero eliminarlo por completo le permite serializarlo. – CaffGeek

+0

¿qué es exactamente lo que quiere almacenar dentro de un 'XElement' en su archivo XML? Parece un poco extraño ..... –

Respuesta

1

Parece que el contenido de XElement - si no nula - No puede ser un elemento XML vacío. En otras palabras, no podría serializar ese XML en su ejemplo de una representación/instancia en memoria de su clase Report.

+1

Esa es la conclusión a la que he llegado, he hablado con el proveedor de ese XML para eliminar elementos nulos – CaffGeek

+0

Esto parece un síntoma de no serializar el XML correctamente en el primer caso, que probablemente se haga con .NET 1.0 XmlSerializer. Para serializar correctamente elementos 'minOccurs =" 0 "' (por ejemplo, elementos que no deberían existir en el XML), necesita un elemento 'bool ParameterTemplateSpecified' en la clase. Consulte http://stackoverflow.com/questions/2330001/xml-serialization-render-empty-element/2541396#2541396 –

0

Puede implementar la interfaz IXmlSerializable en su clase de informe y sobrescribir los métodos ReadXml y WriteXml.

0

Uso IsNullable = True

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

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

Como se menciona en los comentarios anteriores, esto * NO * funciona. – CaffGeek

0

que creó el siguiente método para parchear el texto 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 
Cuestiones relacionadas