XML File einlesen, editieren und wieder speichern. Aber wie?

  • VB.NET
  • .NET 5–6

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    XML File einlesen, editieren und wieder speichern. Aber wie?

    Hallo,
    ich stehe zur Zeit auf dem Schlauch. Ich habe eine XML Datei, die ist leider so vorgegeben (Das Beispiel ist dem Original nachgebaut) und kann leider nicht abgeändert werden.
    Was will ich erreichen. Am liebsten ein Klasse erstellen in der ich via XmlSerializer, oder was auch immer, die XML einlese, bearbeiten kann und wieder speichern kann.
    Nun habe ich die Tolle Funktion in Visual Studio gefunden, die mir aus einem XML in der Zwischenablage eine Klasse erstellt. So weit so gut. Das XML wird eingelesen. Aber wie kann ich z.B. via "For Each" alle Title auslesen? Und wie die Manipulierten Daten wieder in der gleichen XML Datei speichern. Die XML Datei muss danach genau so wieder ausschauen.
    Oder sollte ich einen ganz anderen Weg gehen? Für Anregungen bin ich sehr dankbar.

    Hier mal meine XMLTestdatei:

    XML-Quellcode

    1. <?xml version="1.0" standalone="yes"?>
    2. <XMLApp>
    3. <Title>
    4. <Name>Name 1</Name>
    5. <Manufacturer>Manufacturer 1</Manufacturer>
    6. <Notes>Notes 1</Notes>
    7. <Category>Category 1</Category>
    8. </Title>
    9. <Title>
    10. <Name>Name 2</Name>
    11. <Manufacturer>Manufacturer 2</Manufacturer>
    12. <Notes>Notes 2</Notes>
    13. <Category>Category 2</Category>
    14. </Title>
    15. <Title>
    16. <Name>Name 3</Name>
    17. <Manufacturer>Manufacturer 3</Manufacturer>
    18. <Notes>Notes 3</Notes>
    19. <Category>Category 3</Category>
    20. </Title>
    21. <Title>
    22. <Name>Name 4</Name>
    23. <Manufacturer>Manufacturer 4</Manufacturer>
    24. <Notes>Notes 4</Notes>
    25. <Category>Category 2</Category>
    26. </Title>
    27. <Title>
    28. <Name>Name 5</Name>
    29. <Manufacturer>Manufacturer 5</Manufacturer>
    30. <Notes>Notes 5</Notes>
    31. <Category>Category 1</Category>
    32. </Title>
    33. <PlatformFolder>
    34. <MediaType>Mediatype 1_1</MediaType>
    35. <Filename>Filename 1_1</Filename>
    36. <Name>Name 1</Name>
    37. </PlatformFolder>
    38. <PlatformFolder>
    39. <MediaType>Mediatype 2_1</MediaType>
    40. <Filename>Filename 2_1</Filename>
    41. <Name>Name 2</Name>
    42. </PlatformFolder>
    43. <PlatformFolder>
    44. <MediaType>Mediatype 2_2</MediaType>
    45. <Filename>Filename 2_2</Filename>
    46. <Name>Name 2</Name>
    47. </PlatformFolder>
    48. <PlatformFolder>
    49. <MediaType>Mediatype 3_1</MediaType>
    50. <Filename>Filename 3_1</Filename>
    51. <Name>Name 3</Name>
    52. </PlatformFolder>
    53. <PlatformFolder>
    54. <MediaType>Mediatype 4_1</MediaType>
    55. <Filename>Filename 4_1</Filename>
    56. <Name>Name 4</Name>
    57. </PlatformFolder>
    58. <PlatformFolder>
    59. <MediaType>Mediatype 5_1</MediaType>
    60. <Filename>Filename 5_1</Filename>
    61. <Name>Name 5</Name>
    62. </PlatformFolder>
    63. <PlatformFolder>
    64. <MediaType>Mediatype 5_2</MediaType>
    65. <Filename>Filename 5_2</Filename>
    66. <Name>Name 5</Name>
    67. </PlatformFolder>
    68. <PlatformCategory>
    69. <Name>Category 1</Name>
    70. <Notes>Category Descrition 3</Notes>
    71. </PlatformCategory>
    72. <PlatformCategory>
    73. <Name>Category 2</Name>
    74. <Notes>Category Descrition 3</Notes>
    75. </PlatformCategory>
    76. <PlatformCategory>
    77. <Name>Category 3</Name>
    78. <Notes>Category Descrition 3</Notes>
    79. </PlatformCategory>
    80. </XMLApp>


    Die generierte Klasse:

    VB.NET-Quellcode

    1. Public Class XMLApp
    2. ' HINWEIS: Für den generierten Code ist möglicherweise mindestens .NET Framework 4.5 oder .NET Core/Standard 2.0 erforderlich.
    3. '''<remarks/>
    4. <System.SerializableAttribute(),
    5. System.ComponentModel.DesignerCategoryAttribute("code"),
    6. System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True),
    7. System.Xml.Serialization.XmlRootAttribute([Namespace]:="", IsNullable:=False)>
    8. Partial Public Class ApplicationName
    9. Private titleField() As ApplicationNameTitle
    10. Private platformFolderField() As ApplicationNamePlatformFolder
    11. Private platformCategoryField() As ApplicationNamePlatformCategory
    12. '''<remarks/>
    13. <System.Xml.Serialization.XmlElementAttribute("Title")>
    14. Public Property Title() As ApplicationNameTitle()
    15. Get
    16. Return Me.titleField
    17. End Get
    18. Set
    19. Me.titleField = Value
    20. End Set
    21. End Property
    22. '''<remarks/>
    23. <System.Xml.Serialization.XmlElementAttribute("PlatformFolder")>
    24. Public Property PlatformFolder() As ApplicationNamePlatformFolder()
    25. Get
    26. Return Me.platformFolderField
    27. End Get
    28. Set
    29. Me.platformFolderField = Value
    30. End Set
    31. End Property
    32. '''<remarks/>
    33. <System.Xml.Serialization.XmlElementAttribute("PlatformCategory")>
    34. Public Property PlatformCategory() As ApplicationNamePlatformCategory()
    35. Get
    36. Return Me.platformCategoryField
    37. End Get
    38. Set
    39. Me.platformCategoryField = Value
    40. End Set
    41. End Property
    42. End Class
    43. '''<remarks/>
    44. <System.SerializableAttribute(),
    45. System.ComponentModel.DesignerCategoryAttribute("code"),
    46. System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True)>
    47. Partial Public Class ApplicationNameTitle
    48. Private nameField As String
    49. Private manufacturerField As String
    50. Private notesField As String
    51. Private categoryField As String
    52. '''<remarks/>
    53. Public Property Name() As String
    54. Get
    55. Return Me.nameField
    56. End Get
    57. Set
    58. Me.nameField = Value
    59. End Set
    60. End Property
    61. '''<remarks/>
    62. Public Property Manufacturer() As String
    63. Get
    64. Return Me.manufacturerField
    65. End Get
    66. Set
    67. Me.manufacturerField = Value
    68. End Set
    69. End Property
    70. '''<remarks/>
    71. Public Property Notes() As String
    72. Get
    73. Return Me.notesField
    74. End Get
    75. Set
    76. Me.notesField = Value
    77. End Set
    78. End Property
    79. '''<remarks/>
    80. Public Property Category() As String
    81. Get
    82. Return Me.categoryField
    83. End Get
    84. Set
    85. Me.categoryField = Value
    86. End Set
    87. End Property
    88. End Class
    89. '''<remarks/>
    90. <System.SerializableAttribute(),
    91. System.ComponentModel.DesignerCategoryAttribute("code"),
    92. System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True)>
    93. Partial Public Class ApplicationNamePlatformFolder
    94. Private mediaTypeField As String
    95. Private filenameField As String
    96. Private nameField As String
    97. '''<remarks/>
    98. Public Property MediaType() As String
    99. Get
    100. Return Me.mediaTypeField
    101. End Get
    102. Set
    103. Me.mediaTypeField = Value
    104. End Set
    105. End Property
    106. '''<remarks/>
    107. Public Property Filename() As String
    108. Get
    109. Return Me.filenameField
    110. End Get
    111. Set
    112. Me.filenameField = Value
    113. End Set
    114. End Property
    115. '''<remarks/>
    116. Public Property Name() As String
    117. Get
    118. Return Me.nameField
    119. End Get
    120. Set
    121. Me.nameField = Value
    122. End Set
    123. End Property
    124. End Class
    125. '''<remarks/>
    126. <System.SerializableAttribute(),
    127. System.ComponentModel.DesignerCategoryAttribute("code"),
    128. System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True)>
    129. Partial Public Class ApplicationNamePlatformCategory
    130. Private nameField As String
    131. Private notesField As String
    132. '''<remarks/>
    133. Public Property Name() As String
    134. Get
    135. Return Me.nameField
    136. End Get
    137. Set
    138. Me.nameField = Value
    139. End Set
    140. End Property
    141. '''<remarks/>
    142. Public Property Notes() As String
    143. Get
    144. Return Me.notesField
    145. End Get
    146. Set
    147. Me.notesField = Value
    148. End Set
    149. End Property
    150. End Class
    151. End Class


    Und zu guter letzt mein Code:

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports System.Xml
    4. Imports System.Environment
    5. Imports XMLTest.XMLTest
    6. Module Program
    7. Sub Main(args As String())
    8. Console.WriteLine("XML_Read_Edit_Save_Test")
    9. Dim strXMLFile As String = "C:\PfadzurXMLDatei\testdata.xml"
    10. Dim objXML As New XMLApp
    11. Dim reader As New System.Xml.Serialization.XmlSerializer(GetType(XMLApp))
    12. Dim file As New System.IO.StreamReader(strXMLFile)
    13. objXML = CType(reader.Deserialize(file), XMLApp)
    14. End Sub
    15. End Module
    Wenn es wirklich nur um das einlesen und verändern der XML-Datei geht, so habe ich früher glaube ich immer die Klasse XmlDocument verwendet. Ich müsste es auch wieder anschauen. Ist schon ewig das ich mit diesen Werkzeugen gearbeitet habe. Hast du es schon damit probiert?
    docs.microsoft.com/en-us/dotnet/api/system.xml.xmldocument


    Freundliche Grüsse

    exc-jdbi

    bahnski schrieb:

    Aber wie kann ich z.B. via "For Each" alle Title auslesen?

    Ich finde, mit Serialisierung bist du auf einem sehr guten Weg.
    probierma:

    VB.NET-Quellcode

    1. for each ttl in objXml.Title
    2. Console.Writeline(ttl.Titel.Name)
    3. next

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hallo zusammen.

    Also wenn ich so etwas habe, dann verwende ich eine List(Of ...)

    Hier ein Auszug, wie es bei mir aussehen würde. Natürlich mit deinem Code nicht getestet, aber als Anregung.

    VB.NET-Quellcode

    1. Private titleListe As New List(Of ApplicationNameTitle)
    2. '''<remarks/>
    3. <XmlArrayItem("Titel", IsNullable:=False)>
    4. Public Property Title() As List(Of ApplicationNameTitle)
    5. Get
    6. Return Me.titleListe
    7. End Get
    8. Set
    9. Me.titleListe = Value
    10. End Set
    11. End Property
    So, habe es selber herausgefunden! Hier meine Lösung:

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Xml
    3. Module Program
    4. Dim appPath As String = AppDomain.CurrentDomain.BaseDirectory
    5. Sub Main(args As String())
    6. Console.WriteLine("XML Read Change Write!")
    7. Dim strXMLFile As String = appPath + "testdata.xml"
    8. Dim strXMLOut As String = appPath + "testdataout.xml"
    9. Console.WriteLine("Open XML File:" + strXMLFile)
    10. Dim objXML As New XMLApp.XMLApp
    11. Dim reader As New System.Xml.Serialization.XmlSerializer(GetType(XMLApp.XMLApp))
    12. Dim infile As New System.IO.StreamReader(strXMLFile)
    13. objXML = CType(reader.Deserialize(infile), XMLApp.XMLApp)
    14. infile.Close()
    15. For Each objTitel As XMLApp.XMLAppTitle In objXML.Title
    16. Console.WriteLine(objTitel.Name)
    17. If objTitel.Name = "Name 5" Then
    18. objTitel.Name = "Name 55"
    19. End If
    20. Next
    21. Console.WriteLine("Save Class to XML File:" + strXMLOut)
    22. Dim writer As New System.Xml.Serialization.XmlSerializer(GetType(XMLApp.XMLApp))
    23. Dim outFile As New System.IO.StreamWriter(strXMLOut)
    24. writer.Serialize(outFile, objXML)
    25. outFile.Close()
    26. End Sub
    27. End Module

    Habe ein Testprojekt beigefügt.
    Dateien
    • XMLTest2.zip

      (169,92 kB, 84 mal heruntergeladen, zuletzt: )