vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
XmlSerialisierung 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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 &quot;ArrayOfKUNDE&quot; und &quot;KUNDE&quot;
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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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>
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel