2010-02-04 44 views
5

Tôi có một tài liệu Xml trông tương tự như quáXml Deserialization Thất bại trên Rỗng tử

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

Nó vẫn thất bại serializing để đối tượng này

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

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

Nó không vì yếu tố ParameterTemplate trống rỗng, bởi vì nếu nó chứa yếu tố con nó deserializes tốt.

Làm cách nào để làm việc này?

Đây là Deserialization Mã của tôi

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

Trường hợp ngoại lệ là

Các XmlReader phải nằm trên một node của Element type thay vì một nút kiểu endElement.

Làm cách nào để có được điều này để deserialize với xml hiện tại?

Cảm ơn -c

+0

Ra quan tâm, nó hoạt động tốt nếu nó ' '? –

+0

Không, nhưng loại bỏ nó hoàn toàn không cho phép nó serialize. – CaffGeek

+0

chính xác những gì bạn muốn lưu trữ bên trong 'XElement' trong tệp XML của bạn sau đó ?? Có vẻ hơi lạ ..... –

Trả lời

1

Dường như nội dung của XElement - nếu không null - không thể là một phần tử XML trống. Nói cách khác, bạn sẽ không thể tuần tự hóa rằng XML trong ví dụ của bạn từ một đại diện/bộ nhớ trong bộ nhớ của lớp Report của bạn.

+1

Đó là kết luận mà tôi đã đến, tôi đã nói chuyện với nhà cung cấp XML đó để loại bỏ các phần tử rỗng – CaffGeek

+0

Điều này giống như một triệu chứng không tuần tự hóa XML một cách chính xác trong trường hợp đầu tiên, rất có thể được thực hiện với .NET 1.0 XmlSerializer. Để sắp xếp chính xác các phần tử 'minOccurs =" 0 "' (ví dụ: các phần tử không tồn tại trong XML), bạn cần một phần tử 'bool ParameterTemplateSpecified' trong lớp. Xem http://stackoverflow.com/questions/2330001/xml-serialization-render-empty-element/2541396#2541396 –

0

Bạn có thể triển khai giao diện IXmlSerializable trên lớp báo cáo của mình và ghi đè phương thức ReadXml và WriteXml.

0

Sử dụng 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

Như đã đề cập trong các ý kiến ​​ở trên, điều này không * KHÔNG * hoạt động. – CaffGeek

0

tôi tạo ra các phương pháp sau đây để vá các văn bản 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 
Các vấn đề liên quan