Announcement

Collapse
No announcement yet.

XML Knoten Löschen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XML Knoten Löschen

    Hallo zusammen,
    ich habe folgenden Aufbau in einem XML-File:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <MapDrives>
      <ADUser>
        <User>Ich</User>
        <PWD>JPzW7rV7kmTyIDl4NBgocL3hRxGZfB/i7rDB1k4qEGA=</PWD>
      </ADUser>
      <MapDrive>
        <Drive>r</Drive>
        <UNCPath>\\MeinLW1</UNCPath>
        <Persistent>False</Persistent>
      </MapDrive>
      <MapDrive>
        <Drive>x</Drive>
        <UNCPath>\\MeinLW2</UNCPath>
        <Persistent>False</Persistent>
      </MapDrive>
      <MapDrive>
        <Drive>y</Drive>
        <UNCPath>\\MeinLW3</UNCPath>
        <Persistent>False</Persistent>
      </MapDrive>
    </MapDrives>
    Ich möchte z.B. aus diesem XML-File den Knoten
    Code:
    <MapDrive>
        <Drive>x</Drive>
        <UNCPath>\\MeinLW2</UNCPath>
        <Persistent>False</Persistent>
      </MapDrive>
    löschen.

    Ich mache dies mit folgendem Code:

    [highlight=vbnet]
    Public Function XMLDelete(ByVal TlStrpPGP As ToolStripProgressBar, ByRef PGB As Integer, ByVal Drive As Mapping, ByRef errMsg As String) As Boolean

    If IO.File.Exists(Application.StartupPath & IO.Path.DirectorySeparatorChar & XMLDrives) = False Then
    errMsg = "Es ist keine Datei der Laufwerke vorhanden !"
    Return False
    End If


    Dim XMLReader As Xml.XmlTextReader = Nothing

    Try

    Try
    Dim XMLDoc As System.Xml.XmlDocument = New System.Xml.XmlDocument()
    XMLDoc.Load(Application.StartupPath & IO.Path.DirectorySeparatorChar & XMLDrives)

    Catch ex As Exception
    errMsg = "Fehler:" & vbCrLf & ex.Message
    Return False
    End Try

    XMLReader = New System.Xml.XmlTextReader(Application.StartupPath & IO.Path.DirectorySeparatorChar & XMLDrives)

    Dim XPathDoc As System.Xml.XPath.XPathDocument = New System.Xml.XPath.XPathDocument(XMLReader)
    Dim Navigator As System.Xml.XPath.XPathNavigator

    Navigator = XPathDoc.CreateNavigator()

    Dim Iterator As System.Xml.XPath.XPathNodeIterator = Navigator.Select("/" & strXMLRoot)

    While Iterator.MoveNext
    Dim Nav As System.Xml.XPath.XPathNavigator

    Nav = Iterator.Current.SelectSingleNode(strNodeDrive)

    Do
    If IsNothing(Nav) Then Exit Do
    Dim MyInnerXML() As String = Nothing
    Dim MyDrive As String = String.Empty
    Dim MyUNCPath As String = String.Empty

    MyInnerXML = Split(Nav.InnerXml, vbCrLf)
    If MyInnerXML.Length >= 3 Then
    MyDrive = Strings.Mid(MyInnerXML(0).ToString, MyInnerXML(0).ToString.IndexOf(">") + 2, MyInnerXML(0).ToString.LastIndexOf("<") - MyInnerXML(0).ToString.IndexOf(">") - 1)
    MyUNCPath = Strings.Mid(MyInnerXML(1).ToString, MyInnerXML(1).ToString.IndexOf(">") + 2, MyInnerXML(1).ToString.LastIndexOf("<") - MyInnerXML(1).ToString.IndexOf(">") - 1)
    If Drive.Drive.ToUpper = MyDrive.ToUpper And Drive.UNCPath.ToUpper = MyUNCPath.ToUpper Then
    'Nav.DeleteRange(Nav)
    'Nav.SetValue("")
    Nav.DeleteSelf()

    Exit Do
    End If
    End If

    Loop Until Nav.MoveToNext = False
    End While

    Catch ex As Exception
    errMsg = ex.Message
    Return False
    Finally
    If Not IsNothing(XMLReader) Then
    If Not XMLReader.ReadState = Xml.ReadState.Closed Then XMLReader.Close()
    End If
    End Try

    Return True
    End Function
    [/highlight]

    In folgender Zeile bekomme ich einen Fehler:
    "Die angegebene Methode wird nicht unterstützt"
    Code:
       Nav.DeleteSelf()
    In der Hilfe wird das aber genau so gemacht oder hab ich da was übersehen...?

    Kann mir hier jemand weiterhelfen..
    Oder eine andere Methode vorschlagen...

    Schon mal Danke für eure Untersstützung

  • #2
    OK. Ich habe da was gefunden...
    ...das funktioniert auch..

    [highlight=vbnet]
    Dim XMLNode As Xml.XmlNode = XMLRoot.SelectSingleNode(strNodeDrive & "['@Drive='" & Drive.Drive & "']")
    XMLRoot.RemoveChild(XMLNode)
    [/highlight]

    Aber, ich möcht nicht nur nach einem Merkmal suchen, in diesem Fall Drive, sondern noch nach einem zweiten - UNCPath.

    [highlight=vbnet]
    Dim XMLNode As Xml.XmlNode = XMLRoot.SelectSingleNode(strNodeDrive & "['@Drive='" & Drive.Drive & "' and UNCPath='" & Drive.UNCPath & "']")
    [/highlight]
    Diese Synthax funktioniert aber nicht...

    Hat heirzu jemand eine Idee....???

    Comment


    • #3
      Ich denke deine Benutzung des @ ist falsch. Mit @Name werden Attribute angesprochen. Drive und UNCPath sind aber Knoten und keine Attribute.

      Wenn das nicht hilft und da das eher ein XPath Problem ist solltest du die Frage dann vielleicht nochmal im XML/XPath Forum stellen.

      Existiert ein Schema xsd zu deinem xml oder die Struktur soweit fix das eins erstellbar wäre? Es gibt in .NET eigentlich kaum einen Grund selbst manuell durch die XML Struktur zu navigieren.

      Comment


      • #4
        Ohne @ geht es auch nicht...
        Ein Schema gibt es dazu nicht...

        Existiert ein Schema xsd zu deinem xml oder die Struktur soweit fix das eins erstellbar wäre? Es gibt in .NET eigentlich kaum einen Grund selbst manuell durch die XML Struktur zu navigieren.
        Als Erklärung:
        Ich möchte die Mappings strukturiert in einem XML-File ablegen...
        Die Struktur ist eigentlich fix. Zu Beginn des XML-Files befindet sich der Knoten ADUser mit User und Kennwort. Dann folgen die Mappings, mit Drive, UNCPath und Persistent. Die Anzahl der Mappings ist änderbar. Add und jetzt halt mein Versuch mit delete...
        Wie meinst du das, es gibt keinen Grund zu navigieren?
        Wenn ich einen Knoten löschen will, muss ich diesen doch erst finden um ihn löschen zu können...
        Wie würde ich dies sonst anstellen...?
        Zuletzt editiert von M Merlin; 25.02.2011, 20:44. Reason: Ergänzung

        Comment


        • #5
          Hallo nochmal,
          ein Kollege aus dem Xpath-Forum hats hinbekommen. Das Ergebnis könnt ihr unter folgendem Link nachlesen...
          http://entwickler-forum.de/showthrea...228#post243228

          Comment

          Working...
          X