XML einen 2. Knoten erstellen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Yanbel.

    XML einen 2. Knoten erstellen

    Hallo,

    ich habe ein Problem mit dem erstellen eines 2. Knoten in einer XML Struktur.
    Kann mir jemand einen Tipp geben?

    Bis zum ersten Knoten klappt es

    So soll das XML Ergebniss aussehen:


    XML-Quellcode

    1. <?xml version="1.0" encoding="iso-8859-1"?>
    2. <Root>
    3. <knoten1>
    4. <Element1>Wert1</Element1>
    5. <Element2>Wert2</Element2>
    6. <Element3>Wert3</Element3>
    7. </knoten1>
    8. <knoten2>
    9. <Element4>Wert4</Element4>
    10. <Element5>Wert5</Element5>
    11. <Element6>Wert6</Element6>
    12. </knoten2>
    13. </Root>



    VB.NET-Quellcode

    1. Imports System.Xml

    VB.NET-Quellcode

    1. Dim XmlDoc As New XmlDocument
    2. 'Zeile 1
    3. Dim XmlDeclaration As XmlDeclaration = XmlDoc.CreateXmlDeclaration("1.0", "iso-8859-1", Nothing)
    4. 'Root erstellen
    5. Dim RootNode As XmlElement = XmlDoc.CreateElement("Root")
    6. XmlDoc.InsertBefore(XmlDeclaration, XmlDoc.DocumentElement)
    7. XmlDoc.AppendChild(RootNode)
    8. '1.knoten erstellen
    9. Dim ParentNode As XmlElement = XmlDoc.CreateElement("knoten1")
    10. XmlDoc.DocumentElement.PrependChild(ParentNode)
    11. 'Element erstellen
    12. Dim Element1 As XmlElement = XmlDoc.CreateElement("Element1")
    13. Dim Element2 As XmlElement = XmlDoc.CreateElement("Element2")
    14. Dim Element3 As XmlElement = XmlDoc.CreateElement("Element3")
    15. 'erstellen element text
    16. Dim Element1_Wert As XmlText = XmlDoc.CreateTextNode("Wert1")
    17. Dim Element2_Wert As XmlText = XmlDoc.CreateTextNode("Wert2")
    18. Dim Element3_Wert As XmlText = XmlDoc.CreateTextNode("Wert3")
    19. 'zueisen
    20. ParentNode.AppendChild(Element1)
    21. ParentNode.AppendChild(Element2)
    22. ParentNode.AppendChild(Element3)
    23. 'Schreiben
    24. Element1.AppendChild(Element1_Wert)
    25. Element2.AppendChild(Element2_Wert)
    26. Element3.AppendChild(Element3_Wert)
    27. 'bisher läuft alles
    28. 'Ab Hier hab Ich das Problem
    29. XmlDoc.InsertAfter(ParentNode, RootNode)
    30. '2.knoten erstellen
    31. Dim ParentNode2 As XmlElement = XmlDoc.CreateElement("knoten2")
    32. XmlDoc.DocumentElement.PrependChild(ParentNode2)
    33. 'Element erstellen
    34. Dim Element4 As XmlElement = XmlDoc.CreateElement("Element4")
    35. Dim Element5 As XmlElement = XmlDoc.CreateElement("Element5")
    36. Dim Element6 As XmlElement = XmlDoc.CreateElement("Element6")
    37. 'erstellen element text
    38. Dim Element4_Wert As XmlText = XmlDoc.CreateTextNode("Wert4")
    39. Dim Element5_Wert As XmlText = XmlDoc.CreateTextNode("Wert5")
    40. Dim Element6_Wert As XmlText = XmlDoc.CreateTextNode("Wert6")
    41. ParentNode2.AppendChild(Element4)
    42. ParentNode2.AppendChild(Element5)
    43. ParentNode2.AppendChild(Element6)
    44. 'Schreiben
    45. Element4.AppendChild(Element4_Wert)
    46. Element2.AppendChild(Element5_Wert)
    47. Element6.AppendChild(Element6_Wert)
    48. 'Speichern
    49. XmlDoc.Save("c:\temp\demo.xml")

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „jnpanzer“ ()

    Wenn man davon absieht, dass da wohl am Ende ein InsertAfter oder InsertBefore oder AppendChild oder PrependChild oder was in der Art für ParentNode2 fehlt, ist mir die Reihenfolge etwas suspekt. Da wird ParentNode in Zeile#19 dem Document hinzugefügt und danach geändert.* Das hat doch gar keinen Einfluss auf das Document mehr. Außerdem ist der Code nicht lauffähig. Einmal weil Imports und viele der Anweisungen nicht in einem Scope stehen können, zum anderen, weil bei mir mit diesem Code dann schon eine Exception kommt, siehe Anhang.

    ##########

    * ok, das funktioniert doch
    Bilder
    • Error.png

      67,02 kB, 735×523, 175 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Das Imports habe ich natürlich am Anfang geschrieben.
    Danke für den Tipp leider komme ich nicht richtig weiter.
    Ich mache das erste mal mit XML und VB.NET

    Ich hänge an dieser Zeile ich versteh den Fehler nicht so ganz.

    VB.NET-Quellcode

    1. XmlDoc.InsertAfter(ParentNode, RootNode)


    Ich muss doch sagen wohin er das anängen soill oder ?



    VB.NET-Quellcode

    1. Dim XmlDoc As New XmlDocument
    2. 'Zeile 1
    3. Dim XmlDeclaration As XmlDeclaration = XmlDoc.CreateXmlDeclaration("1.0", "iso-8859-1", Nothing)
    4. 'Root erstellen
    5. Dim RootNode As XmlElement = XmlDoc.CreateElement("Root")
    6. XmlDoc.InsertBefore(XmlDeclaration, XmlDoc.DocumentElement)
    7. XmlDoc.AppendChild(RootNode)
    8. '1.knoten erstellen
    9. Dim ParentNode As XmlElement = XmlDoc.CreateElement("knoten1")
    10. 'Set attribute name and value!
    11. ' ParentNode.SetAttribute("AttributName", "AttributWert")
    12. XmlDoc.DocumentElement.PrependChild(ParentNode)
    13. 'Element erstellen
    14. Dim Element1 As XmlElement = XmlDoc.CreateElement("Element1")
    15. Dim Element2 As XmlElement = XmlDoc.CreateElement("Element2")
    16. Dim Element3 As XmlElement = XmlDoc.CreateElement("Element3")
    17. 'erstellen element text
    18. Dim Element1_Wert As XmlText = XmlDoc.CreateTextNode("Wert1")
    19. Dim Element2_Wert As XmlText = XmlDoc.CreateTextNode("Wert2")
    20. Dim Element3_Wert As XmlText = XmlDoc.CreateTextNode("Wert3")
    21. 'zueisen
    22. ParentNode.AppendChild(Element1)
    23. ParentNode.AppendChild(Element2)
    24. ParentNode.AppendChild(Element3)
    25. 'Schreiben
    26. Element1.AppendChild(Element1_Wert)
    27. Element2.AppendChild(Element2_Wert)
    28. Element3.AppendChild(Element3_Wert)
    29. 'bisher läuft alles
    30. '2.knoten erstellen
    31. Dim ParentNode2 As XmlElement = XmlDoc.CreateElement("knoten2")
    32. 'Element erstellen
    33. Dim Element4 As XmlElement = XmlDoc.CreateElement("Element4")
    34. Dim Element5 As XmlElement = XmlDoc.CreateElement("Element5")
    35. Dim Element6 As XmlElement = XmlDoc.CreateElement("Element6")
    36. 'erstellen element text
    37. Dim Element4_Wert As XmlText = XmlDoc.CreateTextNode("Wert4")
    38. Dim Element5_Wert As XmlText = XmlDoc.CreateTextNode("Wert5")
    39. Dim Element6_Wert As XmlText = XmlDoc.CreateTextNode("Wert6")
    40. ParentNode2.AppendChild(Element4)
    41. ParentNode2.AppendChild(Element5)
    42. ParentNode2.AppendChild(Element6)
    43. 'Schreiben
    44. Element4.AppendChild(Element4_Wert)
    45. Element2.AppendChild(Element5_Wert)
    46. Element6.AppendChild(Element6_Wert)
    47. XmlDoc.InsertAfter(ParentNode, RootNode)
    48. 'Speichern
    49. XmlDoc.Save("c:\temp\demo.xml")

    Welcher Fehler? Bitte immer konkret werden, Felhermeldung + Zeile + ggf. betroffenes Objekt.
    Warum fügst Du in Z#63 ParentNode hinzu und nicht ParentNode2? Warum arbeitest Du da mit InsertAfter, was zu einer Fehlermeldung führt und nicht mit AppendChild wie in Z#17, was funktioniert?

    Z#60 ist falsch. Nicht Element2, sondern Element5
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke für den Tipp habes jetzt verstanden :)
    Komme nun auch weiter..
    Ich dachte man muss "insert.After" verwenden man um den Knoten Punkt zu plazieren.
    Das läuft für den ersten Versuch. Leider Finde ich keine richtige Dokumentation darüber.

    VB.NET-Quellcode

    1. Dim XmlDoc As New XmlDocument
    2. 'Zeile 1
    3. Dim XmlDeclaration As XmlDeclaration = XmlDoc.CreateXmlDeclaration("1.0", "iso-8859-1", Nothing)
    4. 'Root erstellen
    5. Dim RootNode As XmlElement = XmlDoc.CreateElement("Root")
    6. XmlDoc.InsertBefore(XmlDeclaration, XmlDoc.DocumentElement)
    7. XmlDoc.AppendChild(RootNode)
    8. '1.knoten erstellen
    9. Dim ParentNode As XmlElement = XmlDoc.CreateElement("knoten1")
    10. 'Set attribute name and value!
    11. ' ParentNode.SetAttribute("AttributName", "AttributWert")
    12. XmlDoc.DocumentElement.PrependChild(ParentNode)
    13. 'Element erstellen
    14. Dim Element1 As XmlElement = XmlDoc.CreateElement("Element1")
    15. Dim Element2 As XmlElement = XmlDoc.CreateElement("Element2")
    16. Dim Element3 As XmlElement = XmlDoc.CreateElement("Element3")
    17. 'erstellen element text
    18. Dim Element1_Wert As XmlText = XmlDoc.CreateTextNode("Wert1")
    19. Dim Element2_Wert As XmlText = XmlDoc.CreateTextNode("Wert2")
    20. Dim Element3_Wert As XmlText = XmlDoc.CreateTextNode("Wert3")
    21. 'zueisen
    22. ParentNode.AppendChild(Element1)
    23. ParentNode.AppendChild(Element2)
    24. ParentNode.AppendChild(Element3)
    25. 'Schreiben
    26. Element1.AppendChild(Element1_Wert)
    27. Element2.AppendChild(Element2_Wert)
    28. Element3.AppendChild(Element3_Wert)
    29. 'bisher läuft alles
    30. '2.knoten erstellen
    31. Dim ParentNode2 As XmlElement = XmlDoc.CreateElement("knoten2")
    32. 'Element erstellen
    33. Dim Element4 As XmlElement = XmlDoc.CreateElement("Element4")
    34. Dim Element5 As XmlElement = XmlDoc.CreateElement("Element5")
    35. Dim Element6 As XmlElement = XmlDoc.CreateElement("Element6")
    36. 'erstellen element text
    37. Dim Element4_Wert As XmlText = XmlDoc.CreateTextNode("Wert4")
    38. Dim Element5_Wert As XmlText = XmlDoc.CreateTextNode("Wert5")
    39. Dim Element6_Wert As XmlText = XmlDoc.CreateTextNode("Wert6")
    40. ParentNode2.AppendChild(Element4)
    41. ParentNode2.AppendChild(Element5)
    42. ParentNode2.AppendChild(Element6)
    43. 'Schreiben
    44. Element4.AppendChild(Element4_Wert)
    45. Element5.AppendChild(Element5_Wert)
    46. Element6.AppendChild(Element6_Wert)
    47. XmlDoc.DocumentElement.AppendChild(ParentNode2)
    48. 'Speichern
    49. XmlDoc.Save("c:\temp\demo.xml")

    Ich dachte man muss "insert.After" verwenden man um den Knoten Punkt zu plazieren.


    Nein, man verwendet serialisierbare Klassen um komplexere XMLs zu erstellen ;)

    Siehe beispielsweise hier: XML Serialisierung oder hier Tutorial über das Speichern und Laden von XML-Dateienvb-paradise.de/index.php/Threa…ostID=1114702#post1114702



    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Yanbel“ ()

    Ich schiebe dir nochmal ein Beispiel für dich nach, dass 1:1 deine XML-File ausspuckt.

    Du legst dir eine neue Klasse an, die 3 Nested Classes enthält:

    XMLModell und Serialisierung

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Text
    3. Imports System.Xml.Serialization
    4. Imports System.ComponentModel
    5. Public Class XMLExample
    6. <Serializable(),
    7. DebuggerStepThrough(),
    8. DesignerCategory("code"),
    9. XmlType(AnonymousType:=True),
    10. XmlRoot("Root", [Namespace]:="", IsNullable:=False)>
    11. Public Class XMLRoot
    12. <XmlElement(ElementName:="Knoten1", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=1)>
    13. Public Property Knoten1 As Knoten1
    14. <XmlElement(ElementName:="Knoten2", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=2)>
    15. Public Property Knoten2 As Knoten2
    16. End Class
    17. <Serializable(),
    18. DebuggerStepThrough(),
    19. DesignerCategory("code"),
    20. XmlType(AnonymousType:=True),
    21. XmlRoot("Knoten1", [Namespace]:="", IsNullable:=False)>
    22. Public Class Knoten1
    23. <XmlElement("Element1", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=1)>
    24. Public Property Element1 As String
    25. <XmlElement("Element2", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=2)>
    26. Public Property Element2 As String
    27. <XmlElement("Element3", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=3)>
    28. Public Property Element3 As String
    29. End Class
    30. <Serializable(),
    31. DebuggerStepThrough(),
    32. DesignerCategory("code"),
    33. XmlType(AnonymousType:=True),
    34. XmlRoot("Knoten2", [Namespace]:="", IsNullable:=False)>
    35. Public Class Knoten2
    36. <XmlElement("Element4", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=1)>
    37. Public Property Element4 As String
    38. <XmlElement("Element5", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=2)>
    39. Public Property Element5 As String
    40. <XmlElement("Element6", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=3)>
    41. Public Property Element6 As String
    42. End Class
    43. Public Shared Sub Serialize(ByVal Root As XMLRoot, ByVal FileName As String)
    44. Dim Serializer As XmlSerializer = New XmlSerializer(Root.GetType)
    45. Dim XStream As StreamWriter
    46. Dim EmptyNamespace As New XmlSerializerNamespaces()
    47. EmptyNamespace.Add("", "")
    48. Using FileStream As New FileStream(FileName, FileMode.Create)
    49. XStream = New StreamWriter(FileStream, Encoding.UTF8)
    50. Serializer.Serialize(XStream, Root, EmptyNamespace)
    51. FileStream.Close()
    52. End Using
    53. End Sub
    54. Public Shared Sub Deserialize(ByRef Root As XMLRoot, ByVal FileName As String)
    55. Dim Serializer As XmlSerializer = New XmlSerializer(Root.GetType)
    56. Dim EmptyNamespace As New XmlSerializerNamespaces()
    57. EmptyNamespace.Add("", "")
    58. Using FileStream As New FileStream(FileName, FileMode.Open)
    59. Root = TryCast(Serializer.Deserialize(FileStream), XMLExample.XMLRoot)
    60. FileStream.Close()
    61. End Using
    62. End Sub
    63. End Class



    Wenn du diese Klasse implementiert hast, kannst du in deiner Form folgendermaßen das XML zusammenbauen:

    Code in der Form

    VB.NET-Quellcode

    1. Dim Root As New XMLExample.XMLRoot
    2. Root.Knoten1 = New XMLExample.Knoten1 With {.Element1 = "Wert1", .Element2 = "Wert2", .Element3 = "Wert3"}
    3. Root.Knoten2 = New XMLExample.Knoten2 With {.Element4 = "Wert4", .Element5 = "Wert5", .Element6 = "Wert6"}
    4. XMLExample.Serialize(Root, "C:\Temp\demo.xml")



    Ergebnis

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <Root>
    3. <Knoten1>
    4. <Element1>Wert1</Element1>
    5. <Element2>Wert2</Element2>
    6. <Element3>Wert3</Element3>
    7. </Knoten1>
    8. <Knoten2>
    9. <Element4>Wert4</Element4>
    10. <Element5>Wert5</Element5>
    11. <Element6>Wert6</Element6>
    12. </Knoten2>
    13. </Root>





    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Yanbel“ ()