XML schreiben

  • VB.NET
  • .NET (FX) 4.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Sebli76.

    XML schreiben

    Würde gerne folgenden Inhalt per xml writer in eine Textdatei schreiben.
    Aber irgendwie scheitert es an dierser Zeile <game name="ddddd" index="true" image="'">

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. <menu>
    3. <game name="ddddd" index="true" image="'">
    4. <description>'88 Games</description>
    5. <cloneof></cloneof>
    6. <crc>86731451</crc>
    7. <manufacturer>xxx</manufacturer>
    8. <year>1988</year>
    9. <genre>Sports/Track &amp; Field</genre>
    10. <rating>AAMA - Green (Suitable For All Ages)</rating>
    11. <players>4</players>
    12. <ctrltype>Buttons</ctrltype>
    13. <buttons>3</buttons>
    14. <score>3.2</score>
    15. <enabled>Yes</enabled>
    16. </game>
    17. </menu>

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Es scheitert eher an dem nicht gezeigten Code. Wenn du hilfe willst, dann zeige was du bis jetzt hast und auch, warum es scheitert, also was konkret dein Problem ist.
    Es weiß so niemand, ob die gezeigte XML per Code erzeugt wurde oder ob es deine Zielvorstellung ist. Also mehr als nur dünn, was du da lieferst und eine Frage sehe ich auch nicht.
    @Sebli76 Willkommen im Forum. :thumbup:
    Wie sieht Dein bisheriger Code aus?
    Beschreibe mal, was Du da eigentlich abspeichern und wieder laden willst?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja entschuldige, habt ja Recht :)
    Es scheitert weil er sagt, Leerzeichen sind nicht zulässig.

    Quellcode

    1. 'Make Meta List
    2. Sub Button8Click(sender As Object, e As EventArgs)
    3. ' Create XmlWriterSettings.
    4. Dim settings As XmlWriterSettings = New XmlWriterSettings()
    5. settings.Indent = True
    6. settings.IndentChars = " "
    7. ' Create XmlWriter.
    8. Using writer As XmlWriter = XmlWriter.Create(textbox6.Text & "\" & combobox2.text & ".xml", settings)
    9. ' Begin writing.
    10. writer.WriteStartDocument()
    11. writer.WriteStartElement("menu") ' Root.
    12. For i = 0 To dataGridView1.Rows.Count -1
    13. writer.WriteStartElement("game name=" & Chr(34) & dataGridView1.Rows(i).Cells(0).value & Chr(34) & ", index=" & Chr(34) & "true" & chr(34) & ", image=" & chr(34) & chr(34) )
    14. writer.WriteElementString("description", dataGridView1.Rows(i).Cells(1).value)
    15. If Not dataGridView1.Rows(i).Cells(3).value = Nothing
    16. writer.WriteElementString("cloneof", dataGridView1.Rows(i).Cells(3).value)
    17. End If
    18. 'writer.WriteElementString("crc", "")
    19. If Not dataGridView1.Rows(i).Cells(4).value = Nothing
    20. writer.WriteElementString("year", dataGridView1.Rows(i).Cells(4).value)
    21. End If
    22. If Not dataGridView1.Rows(i).Cells(5).value = Nothing
    23. writer.WriteElementString("genre", dataGridView1.Rows(i).Cells(5).value)
    24. End If
    25. 'writer.WriteElementString("rating", "")
    26. If Not dataGridView1.Rows(i).Cells(6).value = Nothing
    27. writer.WriteElementString("players", dataGridView1.Rows(i).Cells(6).value)
    28. End If
    29. If Not dataGridView1.Rows(i).Cells(8).value = Nothing
    30. writer.WriteElementString("ctrltype", dataGridView1.Rows(i).Cells(8).value)
    31. End If
    32. If Not dataGridView1.Rows(i).Cells(15).value = Nothing
    33. writer.WriteElementString("buttons", dataGridView1.Rows(i).Cells(15).value)
    34. End If
    35. 'writer.WriteElementString("Score", "")
    36. writer.WriteElementString("enabled", "yes")
    37. writer.WriteEndElement()
    38. Next
    39. ' End document.
    40. writer.WriteEndElement()
    41. writer.WriteEndDocument()
    42. End Using
    43. End Sub
    Willkommen im Forum!

    Sebli76 schrieb:

    Es scheitert weil er sagt, Leerzeichen sind nicht zulässig.


    Kleiner Hinweis: wenn du einen Fehler hast, immer den Code (hast du ja nachgeholt) posten und am Besten noch einen Verweis auf die Zeile, wo der Fehler geworfen wird. So ist das ein Herumstochern in deinem Code, oder man muss den Code selber irgendwie zurechtfriemeln und selbst dann ist die Chance gering, dass man genau das Verhalten reproduzieren kann, was du hast.

    Irgendwo ein Kommentar ​' hier taucht der Fehler auf! ist da schon eine riesen Hilfe :)
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems

    Selbstständiger Softwareentwickler & IT-Techniker.
    @Sebli76 Frage nicht beantwortet :!:

    RodFromGermany schrieb:

    Beschreibe mal, was Du da eigentlich abspeichern und wieder laden willst?
    Das sieht mir doch sehr danach aus, als wolltest Du noch mehre Datensätze dieser Art speichern.
    Sieh Dir mal das an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private XmlFile As String = "c:\temp\data.xml" ' Pfad zum Speichern / Lesen
    3. Private Data As MyData
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. '' Daten-Instanz erstellen und befüllen
    6. 'Me.Data = New MyData()
    7. 'Me.Data.name = "Test Status"
    8. 'Me.Data.address = "0000"
    9. 'Me.Data.type = 9999
    10. 'Me.Data.timestamp = DateTime.Now
    11. 'Me.Data.flags = 0
    12. 'Me.Data.user = "Tester"
    13. 'Me.Data.SingleValues = New List(Of Integer) From {1, 2, 3, 4, 5}
    14. End Sub
    15. ''' <summary>
    16. ''' Daten von Festplatte laden
    17. ''' </summary>
    18. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    19. Me.Data = MyData.LoadData(Me.XmlFile)
    20. End Sub
    21. ''' <summary>
    22. ''' Daten auf Festplatte schreiben
    23. ''' </summary>
    24. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    25. Me.Data.WriteData()
    26. End Sub
    27. ''' <summary>
    28. ''' aktuelle Daten darstellen
    29. ''' </summary>
    30. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    31. Me.ListBox1.Items.Clear()
    32. ' hier: nur das Integer-Array
    33. For Each value In Me.Data.SingleValues
    34. Me.ListBox1.Items.Add(value)
    35. Next
    36. End Sub
    37. End Class
    38. '#####################################################
    39. '#####################################################
    40. '#####################################################
    41. Imports System.IO
    42. Imports System.Text
    43. Imports System.Xml.Serialization
    44. ''' <summary>
    45. ''' Datenklasse
    46. ''' </summary>
    47. ''' <remarks>mit XML-Serialisierung</remarks>
    48. Public Class MyData
    49. ' Pfad zur geladenen Datei
    50. Private MyFile As String
    51. ' alle vorkommenden Daten
    52. Public Property name() As String
    53. Public Property address() As String
    54. Public Property type() As Integer
    55. Public Property timestamp() As DateTime
    56. Public Property flags() As Integer
    57. Public Property user() As String
    58. Public Property SingleValues() As List(Of Integer)
    59. Public Sub New()
    60. ' Hier die Daten mit Defaultwerten befüllen oder nicht
    61. Me.name = "Hase"
    62. Me.SingleValues = New List(Of Integer)
    63. End Sub
    64. ''' <summary>
    65. ''' Daten aus einer Datei lesen
    66. ''' </summary>
    67. ''' <param name="file">Dateiname</param>
    68. ''' <returns>die geladene Instanz</returns>
    69. Public Shared Function LoadData(file As String) As MyData
    70. Dim data As New MyData()
    71. Try
    72. ' Deserialize XML file to a new object.
    73. Using sr As New StreamReader(file, Encoding.Default)
    74. Dim x As New XmlSerializer(data.GetType())
    75. data = DirectCast(x.Deserialize(sr), MyData)
    76. End Using
    77. ' Pfad merken
    78. data.MyFile = file
    79. Return data
    80. Catch
    81. ' nix tun, die Daten-Instanz ist nicht valid,
    82. ' es wird die Instanz übergeben, die bei New() erzeugt wird
    83. End Try
    84. ' Pfad bei nicht vorgandener Instanz merken
    85. data.MyFile = file
    86. Return data
    87. End Function
    88. ''' <summary>
    89. ''' Daten in eine Datei schreiben
    90. ''' </summary>
    91. Public Sub WriteData()
    92. ' Serialize object to a XML file.
    93. Using sw As New StreamWriter(Me.MyFile, False, Encoding.Default)
    94. Dim x As New XmlSerializer(Me.GetType())
    95. x.Serialize(sw, Me)
    96. End Using
    97. End Sub
    98. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Sebli76
    1. Du proggrammierst Option Strict Off
    2. Du schreibt nicht (auch nicht im Code, der falsch formatiert ist, wo dein erster Fehler auftritt (wurde schon geschrieben)
    3. Du kannst nicht als Startelement das Element samt Attribute rauskloppen. Der Code für dein Startlement sieht so aus:

    VB.NET-Quellcode

    1. writer.WriteStartElement("game")
    2. writer.WriteAttributeString("name", DataGridView1.Rows(i).Cells(0).Value.ToString)
    3. writer.WriteAttributeString("index", true.ToString)
    4. writer.WriteAttributeString("image", "")

    3. Deine Schleife ist eine mittlere Katastrophe, der Test auf Nothing wird so nicht funktionieren. eine leere Zeile ist auch eine Zeile die durchlaufen wird und dann knallt es.
    4. Wenn die XML-Struktur es erlaubt, dann verwende ein Dataset oder IMO besser eine zu serialisierende Klasse, dann kannst du dir a) den ganzen Code zum Schreiben mittels XMLWriter sparen
    und ausserdem kannst du die Daten (Liste von Objekten der Klasse) an das DGV binden und brauchst nicht im DGV herumzustochern.
    Deshalb verwendet man ja sowas, eine View ist eben nur zum gucken und ggf. ändern von Daten. Aber halt nicht zum "Verwalten" der Daten.

    meine generierte XML:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <menu>
    3. <game name="a1" index="True" image="">
    4. <description>a2</description>
    5. <cloneof>a3</cloneof>
    6. <year>a4</year>
    7. <genre>a5</genre>
    8. <players>a6</players>
    9. <ctrltype>a7</ctrltype>
    10. <buttons>a8</buttons>
    11. <enabled>yes</enabled>
    12. </game>
    13. </menu>