.NET XmlSerializer не десериализует массив объектов XmlElementAttribute - PullRequest
0 голосов
/ 03 декабря 2011
  1. Я автоматически сгенерировал некоторые классы, используя xsd.exe для проекта, над которым я работаю.
  2. Я создаю XML-документ с использованием автоматически сгенерированных классов.
  3. AПодмножество схемы очень похоже на html, и я пытаюсь внести необработанный HTML в мои классы
  4. С этой целью я пытаюсь десериализовать фрагмент HTML в класс (не корневой узел), который соответствуетв HTML в моем документе.

Теоретически звучит хорошо, верно?Проблема в том, что мой необработанный текст не будет десериализован.Я делаю что-то неправильно?У меня большой опыт работы с XML и базовый опыт работы с .NET XmlSerializer.Сериализатор не выдает ошибку, он просто не может десериализовать содержимое.

Это код, который я использую для десериализации:

    Dim FromValue As String = "<StrucDoc.Text><table><tr><td>Inside Text</td></tr></table></StrucDoc.Text>"
    Dim ms As New IO.MemoryStream(Encoding.UTF8.GetBytes(FromValue))
    Dim ToValue As HL7.V3.StrucDocText
    Dim t As New System.Xml.Serialization.XmlSerializer(GetType(HL7.V3.StrucDocText))
    ToValue = t.Deserialize(ms)

Важная часть автоматически сгенерированногокод ... он очень большой:

'''<remarks/>
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1"), _
 System.SerializableAttribute(), _
 System.Diagnostics.DebuggerStepThroughAttribute(), _
 System.ComponentModel.DesignerCategoryAttribute("code"), _
 System.Xml.Serialization.XmlTypeAttribute(TypeName:="StrucDoc.Text", [Namespace]:="urn:hl7-org:v3")> _
Partial Public Class StrucDocText

Private itemsField() As Object

Private textField() As String

Private idField As String

Private languageField As String

Private styleCodeField As String

Private mediaTypeField As String

Public Sub New()
    MyBase.New()
    Me.mediaTypeField = "text/x-hl7-text+xml"
End Sub

'''<remarks/>
<System.Xml.Serialization.XmlElementAttribute("br", GetType(StrucDocBr)), _
 System.Xml.Serialization.XmlElementAttribute("content", GetType(StrucDocContent)), _
 System.Xml.Serialization.XmlElementAttribute("footnote", GetType(StrucDocFootnote)), _
 System.Xml.Serialization.XmlElementAttribute("footnoteRef", GetType(StrucDocFootnoteRef)), _
 System.Xml.Serialization.XmlElementAttribute("linkHtml", GetType(StrucDocLinkHtml)), _
 System.Xml.Serialization.XmlElementAttribute("list", GetType(StrucDocList)), _
 System.Xml.Serialization.XmlElementAttribute("paragraph", GetType(StrucDocParagraph)), _
 System.Xml.Serialization.XmlElementAttribute("renderMultiMedia", GetType(StrucDocRenderMultiMedia)), _
 System.Xml.Serialization.XmlElementAttribute("sub", GetType(StrucDocSub)), _
 System.Xml.Serialization.XmlElementAttribute("sup", GetType(StrucDocSup)), _
 System.Xml.Serialization.XmlElementAttribute("table", GetType(StrucDocTable))> _
Public Property Items() As Object()
    Get
        Return Me.itemsField
    End Get
    Set(ByVal value As Object())
        Me.itemsField = value
    End Set
End Property

'''<remarks/>
<System.Xml.Serialization.XmlTextAttribute()> _
Public Property Text() As String()
    Get
        Return Me.textField
    End Get
    Set(ByVal value As String())
        Me.textField = value
    End Set
End Property

'''<remarks/>
<System.Xml.Serialization.XmlAttributeAttribute(DataType:="ID")> _
Public Property ID() As String
    Get
        Return Me.idField
    End Get
    Set(ByVal value As String)
        Me.idField = value
    End Set
End Property

'''<remarks/>
<System.Xml.Serialization.XmlAttributeAttribute(DataType:="NMTOKEN")> _
Public Property language() As String
    Get
        Return Me.languageField
    End Get
    Set(ByVal value As String)
        Me.languageField = value
    End Set
End Property

'''<remarks/>
<System.Xml.Serialization.XmlAttributeAttribute(DataType:="NMTOKENS")> _
Public Property styleCode() As String
    Get
        Return Me.styleCodeField
    End Get
    Set(ByVal value As String)
        Me.styleCodeField = value
    End Set
End Property

'''<remarks/>
<System.Xml.Serialization.XmlAttributeAttribute()> _
Public Property mediaType() As String
    Get
        Return Me.mediaTypeField
    End Get
    Set(ByVal value As String)
        Me.mediaTypeField = value
    End Set
End Property
End Class

После выполнения ToValue.itemsField == null.Я ожидаю массив с одним StrucDocTable элементом.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 05 декабря 2011

Нашел ответ, и я делюсь им для здравомыслия всех.У меня было две проблемы:

  1. HTML просто будет точно отформатирован в нужной структуре.Я добавил tbody в HTML.
  2. Добавил пространство имен XML в разметку и конструкцию XmlSerializer.

    Dim FromValue As String = "<StrucDoc.Text xmlns=""urn:hl7-org:v3""><table><tbody><tr><td>Inside Text</td></tr></tbody></table></StrucDoc.Text>"
    Dim ms As New IO.MemoryStream(Encoding.UTF8.GetBytes(FromValue))
    Dim ToValue As HL7.V3.StrucDocText
    Dim t As New System.Xml.Serialization.XmlSerializer(GetType(HL7.V3.StrucDocText), "urn:hl7-org:v3")
    ToValue = t.Deserialize(ms)
    

После этого я точно получаю свои значениякак и ожидалось!Я надеюсь, что это поможет кому-то там!

...