Leerzeichen in XML erzeugt Fehler

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Vertax.

    Leerzeichen in XML erzeugt Fehler

    Hallo Community,
    ich speicher Namen von Knoten einer TreeView in einer XML Datei um Sie nach Laden des Programs wieder herstellen zu können. Diese Einträge sind dynamisch erstellbar. Nur habe ich nun ein kleines Problem. Es dürfen keine Sonderzeichen im Namen enthalten sein ansonst erhalte ich folgenden Fehler:

    XMLException wurde nicht behandelt
    Das ' '-Zeichen, hexidezimaler Wert 0x20, kann nicht in einen Namen aufgenommen werden.

    Gibt es eine möglichkeit dies zu umgehen? Da ich gerne in der TreeView Leerzeichen hätte.
    Hier mal mein Code

    VB.NET-Quellcode

    1. Public Sub Save_Code()
    2. INI_WriteValueToFile("Einstellungen", "Zähler", frmMain.Zaehler, ".\Einstellungen.ini") 'Speichert den Wert der Variable Zähler in der Datei Einstellungen.ini. Dies wird unter dem Register Einstellungen, Variable Zähler abgelegt.
    3. 'Try
    4. XmlTreeView_Class.SaveToXml("Nodes.xml", frmMain.tvCodeSelect) 'Läd die Sub SaveToXML in der Klasse XMLTreeView , Übergabe Parameter sind "Nodes.xml", Me.tvCodeSelect. Hier werden die Items der TreeView abgespeichert
    5. XML_Verarbeitung.SaveCodeToXML() 'Läd im Module1 die SubRoutine SaveCodeToXML welche dazu dient den Code in einer Sepperaten XML abzuspeichern.
    6. 'Catch ex As Exception
    7. MsgBox("Codes können nicht in Umgebungen abgespeichert werden", MsgBoxStyle.Critical, "ERROR") 'Bei Irgendeinem Fehler gib diese MsgBox aus
    8. 'End Try
    9. End Sub


    VB.NET-Quellcode

    1. ' TreeView-Inhalt (Nodes-Objekte) als XML-Datei speichern
    2. Public Shared Sub SaveToXml(ByVal FileName As String, ByVal TheTreeView As TreeView)
    3. Dim xDoc As New XmlDocument
    4. xDoc.LoadXml("<Nodes></Nodes>")
    5. SaveNodes(xDoc.DocumentElement, TheTreeView.Nodes)
    6. xDoc.Save(FileName)
    7. End Sub
    8. Private Shared Sub SaveNodes(ByVal xNode As XmlNode, ByVal CurrentNodes As TreeNodeCollection)
    9. For Each tn As TreeNode In CurrentNodes
    10. Debug.WriteLine(tn.Text)
    11. SaveNodes(xNode.AppendChild(xNode.OwnerDocument.CreateElement(tn.Text)), tn.Nodes)
    12. Next
    13. End Sub


    VB.NET-Quellcode

    1. Public Sub SaveCodeToXML()
    2. Dim xml As New Xml.XmlDocument()
    3. Dim xmlKD As Xml.XmlElement
    4. Dim xmlUnterKD1 As Xml.XmlElement
    5. Dim xmlUnterKD2 As Xml.XmlElement
    6. Dim xmlUnterKD3 As Xml.XmlElement
    7. Dim xmlText As Xml.XmlText
    8. xml.Load("Code.xml")
    9. xmlKD = xml.CreateElement(frmMain.tvCodeSelect.SelectedNode.Parent.Text)
    10. xmlUnterKD1 = xml.CreateElement(frmMain.tvCodeSelect.SelectedNode.Text)
    11. xmlUnterKD2 = xml.CreateElement("Beschreibung")
    12. xmlUnterKD3 = xml.CreateElement("Code")
    13. xmlText = xml.CreateTextNode(frmMain.txtBeschreibung.Text)
    14. xmlUnterKD2.AppendChild(xmlText)
    15. xmlText = xml.CreateTextNode(frmMain.rtbCode.Text)
    16. xmlUnterKD3.AppendChild(xmlText)
    17. xmlKD.AppendChild(xmlUnterKD1)
    18. xmlUnterKD1.AppendChild(xmlUnterKD2)
    19. xmlUnterKD1.AppendChild(xmlUnterKD3)
    20. xml.DocumentElement.AppendChild(xmlKD)
    21. xml.Save("Code.xml")
    22. End Sub


    Würde mich über Hilfe freuen.
    Du kannst das Leerzeichen vielleicht durch ein anderes Zeichen ersetzen (z. B. _, falls dieses Zeichen erlaubt ist):

    VB.NET-Quellcode

    1. XMLName = Replace(TreeNodeName, " ", "_")


    und beim Laden der XML-Datei wieder "zurück"-ersetzen:

    VB.NET-Quellcode

    1. TreeNodeName = Replace(XMLName, "_", " ")


    Ich weiß nicht, welche Zeichen bei XML erlaubt sind und welche nicht. Du kannst statt dem "_" in meinem Beispiel auch eine Zeichenfolge nehmen, die in deinem TreeView nie so vorkommt, z. B. "xxLeerzeichenxx".

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

    Danke schön, hat wunderbar geklappt

    Aber nochmal eine Frage, kann ich auch mehrere Zeichen ersetzen Lassen in einer Zeile ?

    z.B. R = Replace(tvCodeSelect.SelectedNode.Parent.Text, " ", "_","#","Sharp")

    Weil unter XML können mehrer Zeichen nicht abgespeichert werden.

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

    Du müsstest dann mehrere Replace-Funktionen ineinander verschachteln, z. B. so:

    VB.NET-Quellcode

    1. XMLText = Replace(Replace(TreeNodeText, " ", "xxleerxx"), "#", "xxNummerxx")


    Oder du machst eine Funktion, die die Ersetzungsvorgänge hintereinander durchführt. In der Weise mache ich es, wenn ich aus einem Text einen Dateinamen machen will, der ja bekanntlich kein *|/\<>" enthalten darf:

    VB.NET-Quellcode

    1. Function XMLText(Text As String) As String
    2. XMLText = Replace(Text, " ", "xxleerxx")
    3. XMLText = Replace(XMLText, "#", "xxNummerxx")
    4. End Function
    Ok danke, werds wohl mal mit Funktion probieren. Hab bisher noch paar Probleme mit Übergabe Werten also diese by Ref by Val etc. Aber ich glaube es is die Zeit gekommen wo ich mich damit auseinander setzten sollte, da ich dadurch meinen Code durchaus verkleiner kann.