| |
VB.NET - Ein- und UmsteigerXmlSerialisierung einer List(Of T) | | | Autor: sv00010 | Datum: 23.02.15 17:48 |
| Ich babe eine Liste, welche ich nach Xml serialisiere.
Ich möchte aber gerne die Elemente umbenennen, bekomme das aber nicht hin.
Public Class Verwaltung
Structure KUNDE
<System.Xml.Serialization.XmlElement("Kundennummer")> _
Dim Kundennummer As Long
<System.Xml.Serialization.XmlElement("Vorname")> _
Dim Vorname As String
<System.Xml.Serialization.XmlElement("Nachname")> _
Dim Nachname As String
End Structure
Dim ListOfCustomers As System.Collections.Generic.List(Of KUNDE) In der Datei steht folgendes:
<?xml version="1.0" encoding="utf-8" ?>
- <ArrayOfKUNDE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" _
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <KUNDE>
<Kundennummer>1</Kundennummer>
<Vorname>Hans</Vorname>
<Nachname>Meier</Nachname>
</KUNDE>
</ArrayOfKUNDE> Wie kann ich "ArrayOfKUNDE" und "KUNDE" unbenennen? 0 | |
Re: XmlSerialisierung einer List(Of T) | | | Autor: Kuno60 | Datum: 24.02.15 05:59 |
| sv00010 schrieb:
Zitat: | | Ich babe eine Liste, welche ich nach Xml serialisiere.
Ich möchte aber gerne die Elemente umbenennen, bekomme das
aber nicht hin.
Wie kann ich "ArrayOfKUNDE" und "KUNDE"
unbenennen? | |
Hallo,
genau dafür gibt es das Attribut <XElement>.
Wenn Du es weglässt, müssen die Namen exakt übereinstimmen, ansonsten kann bei <XElement> ein anderer Name, ein anderer Typ und die Reihenfolge angegeben werden.
Hier ein Beispiel:
Imports System.Xml.Serialization
''' <summary>
''' Stellt eine GARMIN Wegpunktdatei dar.
''' </summary>
''' <remarks></remarks>
<XmlRoot("gpx", namespace:="http://www.topografix.com/GPX/1/1")>
Public Class GpxWegpunkte
Inherits GpxGarminBasis
''' <summary>
''' Die Liste aller Wegpunkte.
''' </summary>
''' <remarks></remarks>
<XmlElement("wpt")>
Public Wegpunkte As New List(Of Wegpunkt)
''' <summary>
''' Stellt einen Wegpunkt dar.
''' </summary>
''' <remarks></remarks>
Public Class Wegpunkt
Inherits Punkt
Public Sub New()
MyBase.New()
End Sub
Public Sub New(breitengrad As Decimal, längengrad As Decimal)
MyBase.New(breitengrad, längengrad)
End Sub
''' <summary>
''' Der Name des Wegpunktes.
''' </summary>
''' <remarks></remarks>
<XmlElement("name", order:=2)>
Public Name As String
''' <summary>
''' Die Höhe über NN in Meter.
''' </summary>
''' <remarks></remarks>
<XmlElement("ele", GetType(Decimal), order:=0)>
Public Höhe As Meter
''' <summary>
''' UTC-Zeitpunkt des Erstellens.
''' </summary>
''' <remarks></remarks>
<XmlElement("time", order:=1)>
Public Time As Date
''' <summary>
''' Zusätzlicher Hinweis zu diesem Wegpunkt.
''' </summary>
''' <remarks></remarks>
<XmlElement("cmt", order:=3)>
Public Hinweis As String
''' <summary>
''' Das Symbol für diesen Wegpunkt.
''' </summary>
''' <remarks></remarks>
<XmlElement("sym", order:=4)>
Public Symbol As String
End Class
End Class | |
Re: XmlSerialisierung einer List(Of T) | | | Autor: sv00010 | Datum: 24.02.15 19:20 |
| Ich stelle mich wohl leider zu blöde an.
Ich wollte dein Beispiel nachbauen, aber ich bekomme es leider nicht richtig hin.
Es wirkt einfach nicht.
Ich denke ich mache noch irgendwas falsch und merke es leider nicht.
Public Class Form1
Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
Module1.Test1()
End Sub
End Class Module Module1
Dim Instance_Class1 As New Class1
Sub Test1()
Dim NewItem As New Class2
NewItem.Hinweis = "Hinweis als String"
NewItem.Höhe = 3.67
NewItem.Name = "Test"
NewItem.Symbol = "keines"
NewItem.Time = Date.Now
Instance_Class1.Wegpunkte.Add(NewItem)
Instance_Class1.Save()
End Sub
End Module Public Class Class1
Public Wegpunkte As New List(Of Class2)
Private Sub GetPathname(ByRef strPathnameOUT As String)
Dim strFullyQualifiedName As String = Nothing
Dim strName As String = Nothing
Dim strBasePath As String = Nothing
Dim intLength_FullyQualifiedName As Integer = Nothing
Dim intLength_Name As Integer = Nothing
Dim intLength_BasePath As Integer = Nothing
strPathnameOUT = Nothing
strFullyQualifiedName = _
System.Reflection.Assembly.GetExecutingAssembly.ManifestModule.FullyQ_
ualifiedName
strName = _
System.Reflection.Assembly.GetExecutingAssembly.ManifestModule.Name
intLength_FullyQualifiedName = strFullyQualifiedName.Length
intLength_Name = strName.Length
intLength_BasePath = intLength_FullyQualifiedName - intLength_Name
strBasePath = Microsoft.VisualBasic.Strings.Left(strFullyQualifiedName, _
intLength_BasePath)
strPathnameOUT = strBasePath & "1.xml"
End Sub
Function Save() As Boolean
Dim strPathname As String = Nothing
Dim StreamWriter As System.IO.StreamWriter = Nothing
Dim Serializer As System.Xml.Serialization.XmlSerializer = _
Nothing
'Pfadname herausfinden
Me.GetPathname(strPathname)
Try
StreamWriter = New System.IO.StreamWriter(strPathname)
Serializer = New System.Xml.Serialization.XmlSerializer( _
GetType(List(Of Class2) ) )
Catch ex As Exception
goto ErrorExit
End Try
Try
Serializer.Serialize(StreamWriter, Wegpunkte)
StreamWriter.Close()
Catch ex As Exception
goto ErrorExit
End Try
return True
ErrorExit:
return False
End Function
End Class <System.Xml.Serialization.XmlType("wpt")> _
Public Class Class2
<System.Xml.Serialization.XmlElement("name", order:=2)> _
Public Name As String
<System.Xml.Serialization.XmlElement("ele", order:=0)> _
Public Höhe As Double
<System.Xml.Serialization.XmlElement("time", order:=1)> _
Public Time As Date
<System.Xml.Serialization.XmlElement("cmt", order:=3)> _
Public Hinweis As String
<System.Xml.Serialization.XmlElement("sym", order:=4)> _
Public Symbol As String
End Class Als Datei bekomme ich nun dieses:
<?xml version="1.0" encoding="utf-8" ?>
- <ArrayOfWpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" _
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <wpt>
<ele>3.67</ele>
<time>2015-02-24T19:01:31.1623919+01:00</time>
<name>Test</name>
<cmt>Hinweis als String</cmt>
<sym>keines</sym>
</wpt>
</ArrayOfWpt> Was mache ich falsch? Ich frage weil das mit XmlElement über der Liste hat überhaupt nichts bewirkt.
Das mit dem XmlRoot hatte auch nichts bewirkt.
Wie benenne ich <ArrayOfWpt ... um?
0 | |
Re: XmlSerialisierung einer List(Of T) | | | Autor: sv00010 | Datum: 25.02.15 07:59 |
| Ich habe jetzt herausgefunden, dass es funktioniert, wenn ich statt der List Of T, die gesamte Class1 serialisiere. 0 | |
Re: XmlSerialisierung einer List(Of T) | | | Autor: Kuno60 | Datum: 25.02.15 08:22 |
| Ja genau, so ist es Richtig. Du musst immer die gesamte Klasse serialisieren.
So könnte es mit Deinem Beispiel aussehen.
Die Angabe von <XmlElement> und <XmlRoot> ist nur erforderlich, wenn die Namen der Xml-Datei sich von den Namen in der Klasse oder Struktur unterscheiden.
Public Class Verwaltung
Public Structure Kunde
Dim Kundennummer As Long
Dim Vorname As String
Dim Nachname As String
End Structure
<XmlElement("Kunde")>
Public ListOfCustomers As New List(Of Kunde)
End Class Und so die Xml-Datei erstellen:
Public Sub SchreibeXml(obj As Object, pfad As String, ns As _
XmlSerializerNamespaces)
If obj Is Nothing Then Throw New ArgumentNullException("obj")
Dim fs As IO.FileStream = Nothing
Try
fs = New IO.FileStream(pfad, IO.FileMode.Create, IO.FileAccess.Write)
Dim xs As New Xml.Serialization.XmlSerializer(obj.GetType)
xs.Serialize(fs, obj, ns) 'speichern
Catch ex As Exception
MsgBox(ex.Message & vbNewLine & pfad, MsgBoxStyle.Critical, _
"Serialisation-" & obj.ToString)
Finally
If fs IsNot Nothing Then fs.Close()
End Try
End Sub
Public Sub Speichern()
Dim ordner = My.Computer.FileSystem.SpecialDirectories.Desktop
Dim datei = IO.Path.Combine(ordner, "Test.xml")
Dim ns As New Xml.Serialization.XmlSerializerNamespaces()
'Hier eventuell weitere Namespace hinzufügen
'ns.Add("kd", "http://www.beispiel.com/xmlschemas/v1")
'------------------------------
Dim v As New Verwaltung
Dim k As New Verwaltung.Kunde
k.Kundennummer = 1
k.Vorname = "Hans"
k.Nachname = "Meier"
v.ListOfCustomers.Add(k)
k.Kundennummer = 2
k.Vorname = "Paul"
k.Nachname = "Schnürschuh"
v.ListOfCustomers.Add(k)
'------------------------------
SchreibeXml(v, datei, ns)
End Sub Dieses Beispiel erstellt diese Datei:
<?xml version="1.0"?>
<Verwaltung xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" _
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Kunde>
<Kundennummer>1</Kundennummer>
<Vorname>Hans</Vorname>
<Nachname>Meier</Nachname>
</Kunde>
<Kunde>
<Kundennummer>2</Kundennummer>
<Vorname>Paul</Vorname>
<Nachname>Schnürschuh</Nachname>
</Kunde>
</Verwaltung> | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevOutBar 4.0
Vertikale Menüleisten á la Outlook
Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. Weitere Infos
|