String formatieren / wie XML bereinigen mit REGEX?

  • VB.NET
  • .NET (FX) 4.0

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    String formatieren / wie XML bereinigen mit REGEX?

    Hallihallo, ich habe einen ganz langen String (5MB), der hauptsächlich XML-Daten enthält, aber noch andere überflüssige Zeichen. Den will ich bereinigen, so dass nur noch XML übrig bleibt.

    Also sagen wir aus " a b c <Anfang>Inhalt Inhalt</Anfang> d e f <Mitte>mmm</Mitte> xyz <LeeresEnde/> " soll übrig bleiben:
    "<Anfang>Inhalt Inhalt</Anfang><Mitte>mmm</Mitte><LeeresEnde/>"

    Am besten wäre es natürlich, die Quelle/Generierung zu bereinigen, die Möglichkeit habe ich aber nicht. Wie würdet Ihr das tun? Ich habe mal was über regex gelesen, aber weiß nicht, wie ich das so schreiben sollte, dass der Inhalt zwischen den Tags auch erhalten bleibt..
    Hallo
    Gemäss regexlib.com/Search.aspx?k=xml+tag

    VB.NET-Quellcode

    1. Public Sub Main()
    2. Dim sourcestring As String = " a b c <Anfang>Inhalt Inhalt</Anfang> d e f <Mitte>mmm</Mitte> xyz <LeeresEnde/> "
    3. Dim re As Regex = New Regex("<(\w+)(\s(\w*="".*?"")?)*((\/>)|((\/*?)>.*?<\/\1>))", RegexOptions.Multiline)
    4. Dim mc As MatchCollection = re.Matches(sourcestring)
    5. For Each m As Match In mc
    6. Console.WriteLine(m.Groups(0).Value)
    7. Next
    8. End Sub

    loeten schrieb:

    so dass nur noch XML übrig bleibt.
    Dann solltest Du ihn mit einer XML-Klasse bearbeiten, da ist gesichert, dass hinterher noch XML rauskommt.
    Dein a b c d e f-Inhalt kommt hier nicht als XML-Text an.
    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!
    Ich sehe einen Parser vor meinem Glasauge, der gibt die Koordinaten des ersten Nicht-XML-Inhalts zurück.
    Allerdings die

    loeten schrieb:

    Also sagen wir
    -Beschreibung ist da etwas zu dünn.
    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!
    Naja - sooo dünn nu auch wieder nicht, nur evtl. extrem schwer umzusetzen.
    Die Anforderung ist: aus invalidem Xml soll valides gemacht werden.
    Und die Invalidität besteht darin, Texte engestreut ist, die nicht gemäß Xml-Syntax von Anfang- und EndTag umschlossen sind.

    Aber vlt. ist das Xml nichtmal invalide.
    @loeten: Kannst du dienen Mega-String in ein XmlDocument laden, oder gibt das eine Fehlermeldung?
    Also sowas:

    VB.NET-Quellcode

    1. sub btTest_Click(sender as Object, e as Eventargs)Handles btTest.Click
    2. Dim XDoc As New System.Xml.XmlDocument
    3. XDoc.Load(XmlFileFullname)
    4. end sub

    Wenn das ohne Exception durchläuft, ist die Anforderung nicht mehr: "invalides Xml korrigieren",
    sondern "nur noch": eine Art Filter bauen, der nur Text-Nodes auf unterster Ebene zulässt, und alle anneren Textnodes(-Segmente) eliminiert.

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