2010-02-04 11 views
5

Mam dokumentu XML, która wygląda podobnie zbytXml Deserializacji zawodzi na pusty element

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

zawiedzie szeregowania do tego obiektu

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

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

To upadającego z powodu pustego elementu ParameterTemplate, bo jeśli zawiera elementy podrzędne deserializes dobrze.

Jak mogę to uruchomić?

To jest mój kod deserializacjia

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

Wyjątkiem jest

XmlReader musi znajdować się na węźle typu elementu zamiast węzła typu endElement.

W jaki sposób można uzyskać to z postaci szeregowej z istniejącym xml?

Dzięki -c

+0

Z odsetek, to działa dobrze, jeśli to ' '? –

+0

Nie, ale usunięcie go całkowicie nie pozwala na serializację. – CaffGeek

+0

co dokładnie chcesz przechowywać wewnątrz 'XElement' w pliku XML, a następnie? Wydaje się nieco dziwne ..... –

Odpowiedz

1

Wygląda treści XElement - jeśli nie null - nie może być pusty element XML. Innymi słowy, nie byłbyś w stanie serializować , że XML w twoim przykładzie z reprezentacji/instancji w pamięci twojej klasy Report.

+1

Taki wniosek doszedłem, rozmawiałem z dostawcą tego XML, aby usunąć elementy zerowe – CaffGeek

+0

To wygląda jak objaw nie serializacji XML poprawnie w pierwszy przypadek, który najprawdopodobniej ma miejsce w przypadku .NET 1.0 XmlSerializer. Aby poprawnie serializować elementy 'minOccurs =" 0 "' (na przykład elementy, które nie powinny istnieć w XML), potrzebujesz elementu 'bool ParameterTemplateSpecified' w klasie. Zobacz http://stackoverflow.com/questions/2330001/xml-serialization-render-empty-element/2541396#2541396 –

0

Możesz zaimplementować interfejs IXmlSerializable w klasie raportu i nadpisać metody ReadXml i WriteXml.

0

Zastosowanie 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

Jak wspomniano w komentarzach powyżej, robi to * NIE * działa. – CaffGeek

0

stworzyłem następujący sposób załatać tekst 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 
Powiązane problemy