2016-10-19 3 views
0

Ich muss eine XML-Datei in VB.NET deserialisieren.XML-Array in vb.net deserialisieren

Ich verwende die Standard-XML-Bibliothek. Ich bin nicht in der Lage, die vb Code notieren Sie die folgende Struktur zu definieren:

<myvar> 
    <var>...</var> 
    <troublecodes> 
     <troublecode> 
     ... 
     </troublecode> 
     <troublecode> 
     .... 
     </troublecode> 
     <statusbyte> 
     .... 
     </statusbyte> 
     <statusbyte> 
     .... 
     </statusbyte> 
     <statusbyte> 
     .... 
     </statusbyte> 
    </troublecodes> 
</myvar> 

Meine Definitionen sind:

Public Class MyVar 
    <XmlElement("var")> Public name As String 
    <XmlElement("troublecodes")> Public troubleCodes As TroubleCodes 
End Class 

Public Class TroubleCodes 
<XmlArrayItem("troublecode")> Public troubleCode() As TroubleCode 
<XmlArrayItem("statusbyte")> Public statusByte() As StatusByte 
End Class 

Public Class TroubleCode 
    <XmlElement("one")> Public one As String 
    <XmlElement("two")> Public two As String 
End Class 

Public Class StatusByte 
    <XmlElement("three")> Public threeAs String 
    <XmlElement("four")> Public four As String 
End Class 

aber die Objekte sind nicht durch die Deserialisierung bevölkert.
Wie kann ich sie definieren?

+0

Ich änderte XmlArrayItem zu XmlArray aber wieder keine Daten. – SteMMo

+0

Vielleicht hilft das: http://StackOverflow.com/a/20133287/3740093 –

Antwort

1

Probleme bei der Deserialisierung können in der Regel diagnostiziert werden, indem Sie ein Beispiel für Ihren Stammtyp serialisieren und das generierte XML mit dem gewünschten XML vergleichen. Wenn ich so mit Ihrem MyVar Typ tun (Demo fiddle) bekomme ich folgendes Ergebnis:

<MyVar> 
    <var>my name</var> 
    <troublecodes> 
    <troubleCode> 
     <troublecode> 
     <one>one</one> 
     <two>two</two> 
     </troublecode> 
    </troubleCode> 
    <statusByte> 
     <statusbyte> 
     <three>three</three> 
     <four>four</four> 
     </statusbyte> 
    </statusByte> 
    </troublecodes> 
</MyVar> 

Dies hat die folgenden Probleme:

  • Der Wurzelknoten ist nicht richtig aktiviert.

    Dies kann durch Hinzufügen von <XmlRoot("myvar")> zu Ihrem Stammtyp behoben werden.

  • Es gibt eine zusätzliche Verschachtelungsebene von <troubleCode>.

    Standardmäßig serialisiert XmlSerializer alle Sammlungen einschließlich Arrays mit einem äußeren Containerelement. Um das äußere Containerelement zu unterdrücken und die Auflistung als eine flache Sequenz von Elementen zu serialisieren, ersetzen Sie das XmlArrayItem-Attribut durch <XmlElement("troublecode")>.

  • Es gibt auch eine zusätzliche Verschachtelungsebene von <statusByte>.

So sollte Ihre Art sein, wie folgt:

<XmlRoot("myvar")> _ 
Public Class MyVar 
    <XmlElement("var")> Public name As String 
    <XmlElement("troublecodes")> Public troubleCodes As TroubleCodes 
End Class 

Public Class TroubleCodes 
    <XmlElement("troublecode")> Public troubleCode() As TroubleCode 
    <XmlElement("statusbyte")> Public statusByte() As StatusByte 
End Class 

Public Class TroubleCode 
    <XmlElement("one")> Public one As String 
    <XmlElement("two")> Public two As String 
End Class 

Public Class StatusByte 
    <XmlElement("three")> Public three As String 
    <XmlElement("four")> Public four As String 
End Class 

fiddle behoben.

+1

In meinem Code gibt es nicht die zusätzliche Ebene, die Sie erwähnen .. – SteMMo

+0

@SteMMo - Ich kopierte Ihre Klassen wörtlich in die Geige https: // dotnetfiddle.net/qZaw2t, und sah die zusätzlichen Ebenen. Hast du den Unterricht nach dem Stellen der Frage geändert? Und generieren die Klassen in der Antwort das XML, das Sie benötigen? – dbc

1

Meine Lösung ist:

Public Class TroubleCodes 
    <XmlElement("troublecode")> Public troubleCode() As TroubleCode 
    <XmlElement("statusbyte")> Public statusByte() As StatusByte 
End Class 

Serialisierung der Variable I den gleichen XML-Code zu erhalten.

Verwandte Themen