Problem beim editieren einer Vorhandenen XML

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von FantaZimt.

    Problem beim editieren einer Vorhandenen XML

    Hey, ich hab eine XML Datei für einen Emulator, bei der ich regelmäßig neue Einträge erstellen muss.
    Die XML sieht ca. so aus:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <furnidata>
    3. <roomitemtypes>
    4. <furnitype id="77391" classname="Dragon_water">
    5. <revision>45508</revision>
    6. <defaultdir>4</defaultdir>
    7. <xdim>1</xdim>
    8. <ydim>1</ydim>
    9. <partcolors />
    10. <name>Wasserdrache</name>
    11. <description>by FZ</description>
    12. <adurl />
    13. <offerid>-1</offerid>
    14. <buyout>0</buyout>
    15. <rentofferid>-1</rentofferid>
    16. <rentbuyout>0</rentbuyout>
    17. <bc>1</bc>
    18. <excludeddynamic>0</excludeddynamic>
    19. <customparams />
    20. <specialtype>1</specialtype>
    21. <canstandon>0</canstandon>
    22. <cansiton>0</cansiton>
    23. <canlayon>0</canlayon>
    24. <furniline>rare</furniline>
    25. </furnitype>
    26. <furnitype id="77390" classname="casino16_rarityfountain_black">
    27. <revision>45508</revision>
    28. <defaultdir>4</defaultdir>
    29. <xdim>1</xdim>
    30. <ydim>1</ydim>
    31. <partcolors />
    32. <name>Casino Drachenbrunnen</name>
    33. <description>by FZ</description>
    34. <adurl />
    35. <offerid>-1</offerid>
    36. <buyout>0</buyout>
    37. <rentofferid>-1</rentofferid>
    38. <rentbuyout>0</rentbuyout>
    39. <bc>1</bc>
    40. <excludeddynamic>0</excludeddynamic>
    41. <customparams />
    42. <specialtype>1</specialtype>
    43. <canstandon>0</canstandon>
    44. <cansiton>0</cansiton>
    45. <canlayon>0</canlayon>
    46. <furniline>rare</furniline>
    47. </furnitype>
    48. </roomitemtypes>
    49. </furnidata>


    Jetzt möchte ich bei <roomitemytypes> eben einen neuen Eintrag erstellen. Das ganze versuche ich so:

    VB.NET-Quellcode

    1. Private Sub WriteFurni()
    2. Dim Doku = XDocument.Load(tb_furnidataOrdner.Text & "\furnidata.xml")
    3. Dim NewRecord As XElement =
    4. <roomitemtypes>
    5. </roomitemtypes>
    6. NewRecord.Add(New XElement("revision", ""))
    7. NewRecord.Add(New XElement("defaultdir", ""))
    8. NewRecord.Add(New XElement("xdim", ""))
    9. NewRecord.Add(New XElement("ydim", ""))
    10. NewRecord.Add(New XElement("partcolors", ""))
    11. NewRecord.Add(New XElement("name", ""))
    12. NewRecord.Add(New XElement("description", ""))
    13. NewRecord.Add(New XElement("adurl", ""))
    14. NewRecord.Add(New XElement("offerid", ""))
    15. NewRecord.Add(New XElement("buyout", ""))
    16. NewRecord.Add(New XElement("rentofferid", ""))
    17. NewRecord.Add(New XElement("rentbuyout", ""))
    18. NewRecord.Add(New XElement("bc", ""))
    19. NewRecord.Add(New XElement("excludeddynamic", ""))
    20. NewRecord.Add(New XElement("customparams", ""))
    21. NewRecord.Add(New XElement("specialtype", ""))
    22. NewRecord.Add(New XElement("canstandon", ""))
    23. NewRecord.Add(New XElement("cansiton", ""))
    24. NewRecord.Add(New XElement("canlayon", ""))
    25. NewRecord.Add(New XElement("furniline", ""))
    26. NewRecord.Add(New XElement("canstandon", ""))
    27. Doku.Root.Add(NewRecord)
    28. Doku.Save("C:\Users\FantaZimt\Desktop\FURNI.xml")
    29. End Sub


    So wird das ganze aber leider nicht. Der Eintrag wird ganz unten dann zwischen </roomitemtypes> HIER </furnidata> eingefügt. Außerdem bin ich mir auch nicht ganz sicher, wie ich diesen Eintrag machen soll

    XML-Quellcode

    1. <furnitype id="77391" classname="Dragon_water">
    vielleicht solltest du ein paar grundlegende Sachen über Xml lernen: Was ist Root, was ist ein Element, was ein Attribut?
    Xml-Tutorial

    Dann wird vielleicht klar, warum Doku.Root.Add(NewRecord) den NewRecord ins Root-Element tut, und nicht woannershin.
    Wenn du NewRecord ins roomItemtypes-Element haben möchtest, dann sollteste ihn da auch reintun:

    VB.NET-Quellcode

    1. dim roomTypes=Doku.Root.<roomitemtypes>
    2. roomTypes.Add(NewRecord)
    So ähnlich - hab die Syntax nicht mehr korrekt im Kopf.
    @FantaZimt, bitte vergebe doch einen besseren Titel für diesen Thread, mit diesem - sehr Allgemein gehaltenem - Titel fängt niemand was an.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo FantaZimt,

    für dein Code-Beispiel würde ich die Struktur deines Projektes umstellen auf ein serialisierbares Konstrukt.

    Beispiel: Serialisierbare Klasse

    VB.NET-Quellcode

    1. Namespace ExportFurni
    2. <Serializable(),
    3. DebuggerStepThrough(),
    4. ComponentModel.DesignerCategory("code"),
    5. Xml.Serialization.XmlType(AnonymousType:=True),
    6. Xml.Serialization.XmlRoot("furnidata", [Namespace]:="", IsNullable:=False)>
    7. Public Class FurniData
    8. <Xml.Serialization.XmlArray(Form:=Xml.Schema.XmlSchemaForm.Unqualified),
    9. Xml.Serialization.XmlArrayItem("roomitemtypes", GetType(FurniType), IsNullable:=False)>
    10. Private _roomitemtypes As List(Of FurniType)
    11. Public Property roomitemtypes As List(Of FurniType)
    12. Get
    13. Return _roomitemtypes
    14. End Get
    15. Set(value As List(Of FurniType))
    16. _roomitemtypes = value
    17. End Set
    18. End Property
    19. End Class
    20. <Serializable(),
    21. DebuggerStepThrough(),
    22. ComponentModel.DesignerCategory("code"),
    23. Xml.Serialization.XmlType(AnonymousType:=True),
    24. Xml.Serialization.XmlRoot("furnitype", [Namespace]:="", IsNullable:=False)>
    25. Public Class FurniType
    26. Private _id As String
    27. <Xml.Serialization.XmlAttribute()>
    28. Public Property id As String
    29. Get
    30. Return _id
    31. End Get
    32. Set(value As String)
    33. _id = value
    34. End Set
    35. End Property
    36. Private _classname As String
    37. <Xml.Serialization.XmlAttribute()>
    38. Public Property classname As String
    39. Get
    40. Return _classname
    41. End Get
    42. Set(value As String)
    43. _classname = value
    44. End Set
    45. End Property
    46. Private _revision As String
    47. <Xml.Serialization.XmlElement()>
    48. Public Property revision As String
    49. Get
    50. Return _revision
    51. End Get
    52. Set(value As String)
    53. _revision = value
    54. End Set
    55. End Property
    56. Private _defaultdir As String
    57. <Xml.Serialization.XmlElement()>
    58. Public Property defaultdir As String
    59. Get
    60. Return _defaultdir
    61. End Get
    62. Set(value As String)
    63. _defaultdir = value
    64. End Set
    65. End Property
    66. Private _xdim As String
    67. <Xml.Serialization.XmlElement()>
    68. Public Property xdim As String
    69. Get
    70. Return _xdim
    71. End Get
    72. Set(value As String)
    73. _xdim = value
    74. End Set
    75. End Property
    76. Private _ydim As String
    77. <Xml.Serialization.XmlElement()>
    78. Public Property ydim As String
    79. Get
    80. Return _ydim
    81. End Get
    82. Set(value As String)
    83. _ydim = value
    84. End Set
    85. End Property
    86. Private _partcolors As String
    87. <Xml.Serialization.XmlElement()>
    88. Public Property partcolors As String
    89. Get
    90. Return _partcolors
    91. End Get
    92. Set(value As String)
    93. _partcolors = value
    94. End Set
    95. End Property
    96. Private _name As String
    97. <Xml.Serialization.XmlElement()>
    98. Public Property name As String
    99. Get
    100. Return _name
    101. End Get
    102. Set(value As String)
    103. _name = value
    104. End Set
    105. End Property
    106. Private _description As String
    107. <Xml.Serialization.XmlElement()>
    108. Public Property description As String
    109. Get
    110. Return _description
    111. End Get
    112. Set(value As String)
    113. _description = value
    114. End Set
    115. End Property
    116. Private _adurl As String
    117. <Xml.Serialization.XmlElement()>
    118. Public Property adurl As String
    119. Get
    120. Return _adurl
    121. End Get
    122. Set(value As String)
    123. _adurl = value
    124. End Set
    125. End Property
    126. Private _offerid As String
    127. <Xml.Serialization.XmlElement()>
    128. Public Property offerid As String
    129. Get
    130. Return _offerid
    131. End Get
    132. Set(value As String)
    133. _offerid = value
    134. End Set
    135. End Property
    136. Private _buyout As String
    137. <Xml.Serialization.XmlElement()>
    138. Public Property buyout As String
    139. Get
    140. Return _buyout
    141. End Get
    142. Set(value As String)
    143. _buyout = value
    144. End Set
    145. End Property
    146. Private _rentofferid As String
    147. <Xml.Serialization.XmlElement()>
    148. Public Property rentofferid As String
    149. Get
    150. Return _rentofferid
    151. End Get
    152. Set(value As String)
    153. _rentofferid = value
    154. End Set
    155. End Property
    156. Private _rentbuyout As String
    157. <Xml.Serialization.XmlElement()>
    158. Public Property rentbuyout As String
    159. Get
    160. Return _rentbuyout
    161. End Get
    162. Set(value As String)
    163. _rentbuyout = value
    164. End Set
    165. End Property
    166. Private _bc As String
    167. <Xml.Serialization.XmlElement()>
    168. Public Property bc As String
    169. Get
    170. Return _bc
    171. End Get
    172. Set(value As String)
    173. _bc = value
    174. End Set
    175. End Property
    176. Private _excludeddynamic As String
    177. <Xml.Serialization.XmlElement()>
    178. Public Property excludeddynamic As String
    179. Get
    180. Return _excludeddynamic
    181. End Get
    182. Set(value As String)
    183. _excludeddynamic = value
    184. End Set
    185. End Property
    186. Private _customparams As String
    187. <Xml.Serialization.XmlElement()>
    188. Public Property customparams As String
    189. Get
    190. Return _customparams
    191. End Get
    192. Set(value As String)
    193. _customparams = value
    194. End Set
    195. End Property
    196. Private _specialtype As String
    197. <Xml.Serialization.XmlElement()>
    198. Public Property specialtype As String
    199. Get
    200. Return _specialtype
    201. End Get
    202. Set(value As String)
    203. _specialtype = value
    204. End Set
    205. End Property
    206. Private _canstandon As String
    207. <Xml.Serialization.XmlElement()>
    208. Public Property canstandon As String
    209. Get
    210. Return _canstandon
    211. End Get
    212. Set(value As String)
    213. _canstandon = value
    214. End Set
    215. End Property
    216. Private _cansiton As String
    217. <Xml.Serialization.XmlElement()>
    218. Public Property cansiton As String
    219. Get
    220. Return _cansiton
    221. End Get
    222. Set(value As String)
    223. _cansiton = value
    224. End Set
    225. End Property
    226. Private _canlayon As String
    227. <Xml.Serialization.XmlElement()>
    228. Public Property canlayon As String
    229. Get
    230. Return _canlayon
    231. End Get
    232. Set(value As String)
    233. _canlayon = value
    234. End Set
    235. End Property
    236. Private _furniline As String
    237. <Xml.Serialization.XmlElement()>
    238. Public Property furniline As String
    239. Get
    240. Return _furniline
    241. End Get
    242. Set(value As String)
    243. _furniline = value
    244. End Set
    245. End Property
    246. End Class
    247. End Namespace



    Beispiel: Initilisierung und Befüllen des Objekts und Serialisierung

    VB.NET-Quellcode

    1. Private Sub Emulator_Load(sender As Object, e As EventArgs) Handles Me.Load
    2. Dim FData As New ExportFurni.FurniData
    3. FData.roomitemtypes = New List(Of ExportFurni.FurniType) From {New ExportFurni.FurniType With {.id = "77391",
    4. .classname = "Dragon_water",
    5. .revision = "45508",
    6. .defaultdir = "4",
    7. .xdim = "1",
    8. .ydim = "1",
    9. .name = "Wasserdrache",
    10. .description = "by FZ",
    11. .offerid = "0",
    12. .buyout = "0",
    13. .rentofferid = "-1",
    14. .rentbuyout = "0",
    15. .bc = "1",
    16. .excludeddynamic = "0",
    17. .specialtype = "1",
    18. .canstandon = "0",
    19. .cansiton = "0",
    20. .canlayon = "0",
    21. .furniline = "rare"},
    22. New ExportFurni.FurniType With {.id = "77390",
    23. .classname = "casino16_rarityfountain_black",
    24. .revision = "45508",
    25. .defaultdir = "4",
    26. .xdim = "1",
    27. .ydim = "1",
    28. .name = "Casino Drachenbrunnen",
    29. .description = "by FZ",
    30. .offerid = "-1",
    31. .buyout = "0",
    32. .rentofferid = "-1",
    33. .rentbuyout = "0",
    34. .bc = "1",
    35. .excludeddynamic = "0",
    36. .specialtype = "1",
    37. .canstandon = "0",
    38. .cansiton = "0",
    39. .canlayon = "0",
    40. .furniline = "rare"}}
    41. XMLSerialize(FData, "C:\Temp\FURNI.xml")
    42. End Sub
    43. Public Sub XMLSerialize(FurniData As ExportFurni.FurniData, Filename As String)
    44. Dim Serializer As XmlSerializer = New XmlSerializer(FurniData.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, FurniData, EmptyNamespace)
    51. FileStream.Close()
    52. End Using
    53. End Sub




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

    Das ist schon fast so, wie ich das gerne hätte, denke ich.
    Allerdings müsste ich, mit deiner Lösung alle XML Einträge neu erstellen und kann nicht so meine jetzige XML verwenden. Bei rund 250.000 Zeilen wäre das ein wenig zu viel Arbeit.
    Wenn ich jetzt Create durch Append ändern würde (um die aktuelle XML zu behalten), würde doch der Teil einfach nur angehängt werden oder nicht?

    VB.NET-Quellcode

    1. Using FileStream As New FileStream(Filename, FileMode.Append)
    2. End Using


    Ich müsste doch also erst die XML einlesen oder kann man einfach den neuen Teil "passend" Eintragen?

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

    @FantaZimt Würde es genügemn, wenn Du die Datei im Notepad++ editiertest?
    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!
    Momentan mache ich das auch so, allerdings ist das ziemlich nervig wenn man mal 100 und mehr Einträge machen muss.
    Zu jedem Eintrag gibt es auch 2 MySQL Einträge, wobei ich die bereits automatisiert habe. Wenn ich das mit der XML noch hin bekommen würde, wäre es natürlich deutlich angenehmer.
    @FantaZimt: Ich habe dir die Lösung vorgeschlagen, weil man mit einem Objekt viel besser umgehen kann als das XML ständig von Hand zu basteln. Ich kann dich echt nur ermutigen mit serialisierbaren Klassen zu arbeiten, weil dir das im Laufe der Zeit wieder und wieder Arbeit erspart.

    Die korrekte Lösung hast du schon mit Post#2 von @ErfinderDesRades bekommen.

    Problematisch sind diese Zeilen:

    VB.NET-Quellcode

    1. Dim NewRecord As XElement =
    2. <roomitemtypes>
    3. </roomitemtypes>


    roomitemtypes muss ein Root-Knoten sein und NewRecord darf nicht roomitemtypes sein, sondern muss vom furnitype sein (hier fehlen auch noch die XMLAttribute id und classname).

    Das hier ist das nächste Problem:

    VB.NET-Quellcode

    1. Doku.Root.Add(NewRecord)

    NewRecord (also dein Furnitype) muss zum Root roomitemtypes geadded werden und nicht zu deinem obersten Rootknoten (furnydata)


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    @ErfinderDesRades
    Also, ich habe mir dein Tutorial jetzt mal zu Herzen genommen.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub XMLTEST()
    2. Dim XDoc As New XmlDocument
    3. Dim xFurnidata, xRoomitemtypes, xFurnitype, xRevision, xDefaultdir, xXdim, xYdim, xPartcolors, xName, xDescription, xAdurl, xOfferid, xBuyout, xRentofferid, xRentbuyout, xBc, xExcludeddynamic, xCustomparams, xSpecialtype, xCanstandon, xCansiton, xCanlayon, xFurniline As XmlElement
    4. Dim XDecl As XmlDeclaration = XDoc.CreateXmlDeclaration("1.0", "utf-8", "")
    5. XDoc.AppendChild(XDecl)
    6. xFurnidata = AppendElement(XDoc, "furnidata")
    7. xRoomitemtypes = AppendElement(xFurnidata, "roomitemtypes")
    8. xFurnitype = AppendElement(xRoomitemtypes, "furnitype")
    9. With xFurnitype
    10. .SetAttribute("id", tb_id.Text)
    11. .SetAttribute("classname", cName)
    12. End With
    13. xRevision = AppendElement(xFurnitype, "revision")
    14. xRevision.InnerText = "45508"
    15. xDefaultdir = AppendElement(xFurnitype, "defaultdir")
    16. xDefaultdir.InnerText = "4"
    17. xXdim = AppendElement(xFurnitype, "xdim")
    18. xXdim.InnerText = "1"
    19. xYdim = AppendElement(xFurnitype, "ydim")
    20. xYdim.InnerText = "1"
    21. xPartcolors = AppendElement(xFurnitype, "partcolors")
    22. 'xPartcolors.InnerText = ""
    23. xName = AppendElement(xFurnitype, "name")
    24. xName.InnerText = tb_itemname.Text
    25. xDescription = AppendElement(xFurnitype, "description")
    26. xDescription.InnerText = tb_itembeschreibung.Text
    27. xAdurl = AppendElement(xFurnitype, "adurl")
    28. 'xAdurl.InnerText = ""
    29. xOfferid = AppendElement(xFurnitype, "offerid")
    30. xOfferid.InnerText = "-1"
    31. xBuyout = AppendElement(xFurnitype, "buyout")
    32. xBuyout.InnerText = "0"
    33. xRentofferid = AppendElement(xFurnitype, "rentofferid")
    34. xRentofferid.InnerText = "-1"
    35. xRentbuyout = AppendElement(xFurnitype, "rentbuyout")
    36. xRentbuyout.InnerText = "0"
    37. xBc = AppendElement(xFurnitype, "bc")
    38. xBc.InnerText = "1"
    39. xExcludeddynamic = AppendElement(xFurnitype, "excludeddynamic")
    40. xExcludeddynamic.InnerText = "0"
    41. xCustomparams = AppendElement(xFurnitype, "customparams")
    42. 'xCustomparams.InnerText = "0"
    43. xSpecialtype = AppendElement(xFurnitype, "specialtype")
    44. xSpecialtype.InnerText = "1"
    45. xCanstandon = AppendElement(xFurnitype, "canstandon")
    46. xCanstandon.InnerText = "0"
    47. xCansiton = AppendElement(xFurnitype, "cansiton")
    48. xCansiton.InnerText = Sitzen
    49. xCanlayon = AppendElement(xFurnitype, "canlayon")
    50. xCanlayon.InnerText = "0"
    51. xFurniline = AppendElement(xFurnitype, "furniline")
    52. xFurniline.InnerText = "rare"
    53. XDoc.Save("./furni.xml")
    54. End Sub


    Und ich habe es zumindest ein wenig verstanden. Aber auch hier hängt es dann wieder beim Speichern, da XDoc.save die Datei ja überschreibt, anstatt sie zu ergänzen.
    Also, ich habe es jetzt so hinbekommen, so wie ich es mir wünsche.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub WriteFurnidata()
    2. Dim XDoc As New XmlDocument
    3. XDoc.Load("./furni.xml")
    4. Dim root As XmlNode = XDoc.SelectSingleNode("furnidata/roomitemtypes")
    5. Dim xFurnitype, xRevision, xDefaultdir, xXdim, xYdim, xPartcolors, xName, xDescription, xAdurl, xOfferid, xBuyout, xRentofferid, xRentbuyout, xBc, xExcludeddynamic, xCustomparams, xSpecialtype, xCanstandon, xCansiton, xCanlayon, xFurniline As XmlElement
    6. xFurnitype = XDoc.CreateElement("furnitype")
    7. xFurnitype = root.PrependChild(xFurnitype)
    8. With xFurnitype
    9. .SetAttribute("id", tb_id.Text)
    10. .SetAttribute("classname", swfName)
    11. End With
    12. XDoc = xFurnitype.OwnerDocument
    13. xRevision = XDoc.CreateElement("revision")
    14. xRevision.InnerText = "45508"
    15. xDefaultdir = XDoc.CreateElement("defaultdir")
    16. xDefaultdir.InnerText = "4"
    17. xXdim = XDoc.CreateElement("xdim")
    18. xXdim.InnerText = "1"
    19. xYdim = XDoc.CreateElement("ydim")
    20. xYdim.InnerText = "1"
    21. xPartcolors = XDoc.CreateElement("partcolors")
    22. 'xPartcolors.InnerText = ""
    23. xName = XDoc.CreateElement("name")
    24. xName.InnerText = tb_itemname.Text
    25. xDescription = XDoc.CreateElement("description")
    26. xDescription.InnerText = tb_itembeschreibung.Text
    27. xAdurl = XDoc.CreateElement("adurl")
    28. 'xAdurl.InnerText = ""
    29. xOfferid = XDoc.CreateElement("offerid")
    30. xOfferid.InnerText = "-1"
    31. xBuyout = XDoc.CreateElement("buyout")
    32. xBuyout.InnerText = "0"
    33. xRentofferid = XDoc.CreateElement("rentofferid")
    34. xRentofferid.InnerText = "-1"
    35. xRentbuyout = XDoc.CreateElement("rentbuyout")
    36. xRentbuyout.InnerText = "0"
    37. xBc = XDoc.CreateElement("bc")
    38. xBc.InnerText = "1"
    39. xExcludeddynamic = XDoc.CreateElement("excludeddynamic")
    40. xExcludeddynamic.InnerText = "0"
    41. xCustomparams = XDoc.CreateElement("customparams")
    42. 'xCustomparams.InnerText = "0"
    43. xSpecialtype = XDoc.CreateElement("specialtype")
    44. xSpecialtype.InnerText = "1"
    45. xCanstandon = XDoc.CreateElement("canstandon")
    46. xCanstandon.InnerText = "0"
    47. xCansiton = XDoc.CreateElement("cansiton")
    48. xCansiton.InnerText = Sitzen
    49. xCanlayon = XDoc.CreateElement("canlayon")
    50. xCanlayon.InnerText = "0"
    51. xFurniline = XDoc.CreateElement("furniline")
    52. xFurniline.InnerText = "rare"
    53. xFurnitype.AppendChild(xRevision)
    54. xFurnitype.AppendChild(xDefaultdir)
    55. xFurnitype.AppendChild(xXdim)
    56. xFurnitype.AppendChild(xYdim)
    57. xFurnitype.AppendChild(xName)
    58. xFurnitype.AppendChild(xAdurl)
    59. xFurnitype.AppendChild(xOfferid)
    60. xFurnitype.AppendChild(xBuyout)
    61. xFurnitype.AppendChild(xRentofferid)
    62. xFurnitype.AppendChild(xRentbuyout)
    63. xFurnitype.AppendChild(xBc)
    64. xFurnitype.AppendChild(xExcludeddynamic)
    65. xFurnitype.AppendChild(xCustomparams)
    66. xFurnitype.AppendChild(xSpecialtype)
    67. xFurnitype.AppendChild(xCanstandon)
    68. xFurnitype.AppendChild(xCansiton)
    69. xFurnitype.AppendChild(xCanlayon)
    70. xFurnitype.AppendChild(xFurniline)
    71. XDoc.Save("./furni.xml")
    72. End Sub


    Sieht zwar nicht so hübsch aus, aber funktioniert.

    Vielen Dank @ErfinderDesRades :thumbsup: