| 

.NET C# Java Javascript Exception

2
Hallo Zusammen,
ich versuche eine XML-Datei in vb.net zu deserialisieren und habe dabei Probleme bei der Klassendefinition. Die XML-Datei hat folgenden Inhalt:

<?xml version="1.0"?>
<ocs>
<meta>
<status>ok</status>
<statuscode>100</statuscode>
<message/>
</meta>
<data>
<element>
<element>
<id>11</id>
<item_type>file</item_type>
<item_source>17</item_source>
<parent/>
<share_type>3</share_type>
<share_with/>
<file_source>17</file_source>
<path>/test/example.ppt</path>
<permissions>1</permissions>
<stime>1392888120</stime>
<expiration/>
<token>cbcafdae14b356907c62c887a5001192</token>
<storage>2</storage>
<mail_send>0</mail_send>
<uid_owner>user</uid_owner>
<displayname_owner>Owner</displayname_owner>
</element>
<filename>example.ppt</filename>
</element>
<element>
<element>
<id>2</id>
<item_type>folder</item_type>
<item_source>56</item_source>
<parent/>
<share_type>3</share_type>
<share_with/>
<file_source>56</file_source>
<path>/test/xml_test</path>
<permissions>1</permissions>
<stime>1376038660</stime>
<expiration/>
<token>e5412f27ff345f961d3495b828d09024</token>
<storage>2</storage>
<mail_send>0</mail_send>
<uid_owner>owner</uid_owner>
<displayname_owner>besitzer</displayname_owner>
</element>
<filename>xml_test</filename>
</element>
</data>
</ocs>


Folgende Klassen wurden definiert:

Public Class ShareElementDTO
Public Property id() As Integer
Public Property item_type() As String
Public Property item_source() As Integer
Public Property parent() As String
Public Property share_type() As Integer
Public Property share_with() As String
Public Property file_source() As Integer
Public Property path() As String
Public Property permissions() As Integer
Public Property stime() As Long
Public Property expiration() As Long
Public Property token() As String
Public Property storage() As Integer
Public Property mail_send() As Integer
Public Property uid_owner() As String
Public Property displayname_owner() As String
End Class

Public Class element
Public Property element() As ShareElementDTO
Public Property filename() As String
End Class

Public Class ShareDataDTO
Public element As New List(Of element)()
End Class

Public Class GetShareDTO
Public Property meta() As MetaDTO
Public Property data() As ShareDataDTO
End Class


Zu Deserialisierung nutze ich folgende vb.net Anweisungen:

Sub DeserializeXML(xmlString)
Dim responseDS As GetShareDTO = CType(DeSerializeFromXML(Of GetShareDTO)(xmlString, GetType(GetShareDTO)), GetShareDTO)

debug.writeline(responseDS.data.element(0).element.value)
debug.writeline(responseDS.data.element(0).filename.value)
debug.writeline(responseDS.data.element(1).element.value)
debug.writeline(responseDS.data.element(1).filename.value)
end sub

Private Function DeSerializeFromXML(Of T)(ByVal xml As String, ByVal type As Type) As T
Try
Dim x As New XmlSerializer(type)
Dim xmlBytes() As Byte = Encoding.Default.GetBytes(xml)
Using ms As New MemoryStream(xmlBytes)
Return x.Deserialize(ms)
End Using
Catch
Throw
End Try
End Function


Beider Werte responseDS.data.element(0).element.value und responseDS.data.element(0).filename.value
haben jeweils den Wert "nothing".

Was ist falsch bei der Klassendefintion? Für einen entsprechenden Hinweis wäre ich sehr dankbar.

Vielen Dank!
News:
22.02.2014
klare 13 4
3 Antworten
2
An deinem Code ist nicht nur die Klassendefinition falsch. DeserializeXML dürfte eigentlich gar nicht durch den Compiler kommen, denn ein value Property gibt es weder auf element (vom Typ ShareElementDTO) und auch nicht auf filename, das ein String ist.

Wenn die Compiler error weg sind, läufst du tatsächlich in das Problem, dass die Klassendefinition nicht zur XML Datei passt. Hier schließe ich mich ffordermaier an, ein Schema muss her, insbesondere in Bezug auf expiration, das du als Long property definiert hast, das entsprechende Element im XML aber keinen Long Wert enthält. Das lässt sich so nicht deserialisieren.

Als Stütze, damit du weiterkommst, hier ein lauffähiges Beispiel inklusive der nötigen Attribute, aber denke daran, erstelle ein Schema bevor du weitermachst.

Imports System.Xml.Serialization

<XmlRoot("element")>
Public Class ShareElementDTO
Public Property id() As Integer
Public Property item_type() As String
Public Property item_source() As Integer
Public Property parent() As String
Public Property share_type() As Integer
Public Property share_with() As String
Public Property file_source() As Integer
Public Property path() As String
Public Property permissions() As Integer
Public Property stime() As Long
Public Property expiration() As Object
Public Property token() As String
Public Property storage() As Integer
Public Property mail_send() As Integer
Public Property uid_owner() As String
Public Property displayname_owner() As String
End Class

<XmlRoot("element")>
<XmlInclude(GetType(ShareElementDTO))>
Public Class ElementDTO
Public Property element() As ShareElementDTO
End Class

<XmlRoot("element")>
<XmlInclude(GetType(ShareElementDTO))>
Public Class ShareDataDTO
Public element As New ShareElementDTO
Public Property filename() As String
End Class


<XmlRoot("ocs")>
<XmlInclude(GetType(ShareDataDTO))>
Public Class GetShareDTO
Public Property meta() As MetaDTO
<XmlArrayItem("element")>
Public Property data() As List(Of ShareDataDTO)
End Class

<XmlRoot("meta")>
Public Class MetaDTO
Public Property status() As String
Public Property statuscode() As Integer
Public Property message() As String
End Class
23.02.2014
Maria Simlinger 1,1k 1 9
2
Ich würde an Deiner Stelle die Klassendefinition gar nicht selbst schreiben, sondern von einem Tool erzeugen lassen. Das .NET Framework bietet dafür xsd.exe. Damit kannst Du zuerst aus Deiner XML Datei ein Schema inferieren und danach auf Basis des Schemas VB.NET SourceCode erzeugen lassen.
Das von xsd.exe erzeugte Schema kann auch zuerst noch manuell nachbearbeitet werden. Falls Du schon ein Schema hast, entfällt Schritt 1 und Du kannst Dir Deine Klassendefinition sofort erzeugen lassen.
23.02.2014
ffordermaier 8,4k 3 9
Hallo ffordermaier,
Danke für Deinen Hinweis auf das Tool xsd.exe. Dies kannte ich noch nicht. Nach einem solchen Tool hatte ich schon länger gesucht.
klare 23.02.2014
0
Hallo Maria,
vielen Dank für Deinen Hinweis und das Beispiel für die Klassendefinition. Es hat mir sehr weitergeholfen und ich konnte damit mein Problem lösen.

Danke nochmals,
klare
23.02.2014
klare 13 4

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH