Announcement

Collapse
No announcement yet.

XML Datei nach Element Splitten

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

  • XML Datei nach Element Splitten

    Guten Morgen,

    ich versuche schon eine ganze Weile eine große XML Datei in mehrere Dateien aufzusplitten. Das soll nach dem Schließen eines speziellen Elements passieren.

    Habe bereits mehrere Möglichkeiten ausprobiert:

    - Xpath Element- und Attributwerte einlesen und direkt in neue Datei schreiben (Problem: Setzen des Zeigers auf die nächste "Elementgruppe")

    - Mit Xpath allles einlesen, Element- und Attributwerte in Collections speichern und darauf basierend eine XML-Datei pro Collection-Item schreiben. (Problem: manche Elemente/Attribute sind optional)

    Jetzt versuche ich gerade das Ganze mit einem einfachen StreamReader und dem Split-Befehl zu lösen. Den Inhalt der Datei habe ich bereits komplett in einen String laden können. Der nächste Schritt wäre das Splitten.
    Hier habe ich 2 Probleme:

    1. Ich muss im Prinzip Beginn und Ende angeben (<Partneridentifier>, </Partneridentifier>)

    2. Ich weiss nicht wie ich den Inhaltsstring durchlaufen soll. Mir fehlt eine passende Bedingung

    Es wäre sehr nett, wenn man mir helfen könnte.

    Code:
         Sub ReadXmln(ByVal sourcePath As String)
            Dim DateiPfad = sourcePath & ".xml"
            Dim sr As StreamReader = New StreamReader(DateiPfad)
            Dim Von = "<PartnerIdentifier"
            Dim Bis = "</PartnerIdentifier>"
            Dim Ausgabe As String = ""
            Dim AusDatei As String
            Dim Collect As Boolean
            Dim Inhalt() As String
    
            Inhalt = Split(sr.ReadToEnd(), vbCrLf)
    
            For i = 0 To UBound(Inhalt)
                If InStr(Inhalt(i), Von) > 0 Then
                    Ausgabe = Ausgabe & Inhalt(i)
                    AusDatei = ""
                    Collect = True
                End If
                If Collect Then
                    Ausgabe = Ausgabe & Inhalt(i)
                End If
                If InStr(Inhalt(i), Bis) > 0 Then
                    Ausgabe = Ausgabe & Inhalt(i)
                    Collect = False
                    MsgBox(Ausgabe)
                    Ausgabe = ""
                End If
            Next
        End Sub
    Läuft fast, aber ich kriege das Start- und Endtag von PartnerIdentifier doppelt ausgegeben.
    Zuletzt editiert von julia86; 13.03.2012, 10:41.

  • #2
    Benutzte doch lieber System.Xml.XmlDocument um die Datei einzulesen, als dir so einen abzubrechen.
    Code:
    Dim DateiPfad = sourcePath & ".xml"
    Dim sr As StreamReader = New StreamReader(DateiPfad)
    Dim XmlDoc As New System.Xml.Xml.Document
    
    XmlDoc.Load(sr)

    Comment


    • #3
      Selbiges

      Hallo,

      Ich hatte selbige anforderung

      Meine lösung:


      Mittels XPath den Knoten selektieren,
      OuterXML parsen und neu abspeichern.

      Wenn du die volle Struktur beibehalten willst muss du das XMLDoc halt
      parent für parent durchlaufen und Childs leeren und das geparste OuterXML an innserster Stelle wieder einfügen.

      Gruß Cad

      Comment

      Working...
      X