xml schön aufbereiten

  • Hallo Ihr Profis,

    ich habe ein oder mehrere unformatierte xml-Dateien, die ich gerne mit AutoIt einlesen und dann wieder "schön" formatiert raus schreiben würde.

    Unter schön meine ich je nach Syntax tiefer eingerückt. Nennt man das tidy? Oder reindent?

    Ich bin auf _XMLDomWrapper.au3 gestossen, aber das übersteigt meinen Horizont.

    Gibt es für mein Vorhaben eine Lösung?

    Habt Dank!
    Mike

  • Hab Dank für Deine Antwort, aber ich suche keine Lösung über ein zu bedienendes Programm, sondern würde es gerne in ein bestehendes AutoIt-Programm einbauen, da sich die Dateien laufend ändern.

    Dank Google habe ich entdeckt, dass Notepad++ genau das mit der Datei macht, was ich über AutoIT gerne machen würde. Notepad++ :TextFX -> HTML Tidy -> Reindent XML

    Zur Not wäre ich auch mit einem Programm zufrieden, was man über ShellExecute oder Run aufrufen kann, also quasi MachXMLSchön.exe <quelle-datei> <zeil-datei>, falls es sowas gibt.

    Habt Dank!
    Mike

  • Johannes hab Dank für Deine Antwort, aber Du überforderst mich mit Deinen Fachausdrücken wie PCDATA und StAX-Paradigma :(

    Ich schau mal, ob ich neutrale Beispiele einstellen kann, damit Du Dir ein Bild von der Komplexität machen kannst.

    Für mich sieht das nicht einfach aus, aber ich bin kein xml-Profi. Jedenfalls bekomme ich bei all meinen Dateien beim Versuch sie mittels _XMLFileOpen("MeineXML.xml") zu öffnen, einen Parse Error. _XMLTransform wäre dann vielleicht eine Lösung, zumindest nach der Beschreibung, aber soweit komme ich ja gar nicht.

    Habt Dank
    Mike

  • Ja genau so sieht mein Code im Prinzip auch aus, nur dass mir _XMLFileOpen den Error 1 (lt. Dokumentation "Parse Error") zurückliefert. Dann brauche oder kann ich doch erst gar nicht weiter zu machen, oder?

    Hab Dank!
    Mike

  • Hab Dank für Deine Mühen!

    Ich habe lediglich Dein Script um die Error-Ausgabe erweitert, wobei das unnötig ist, da eh ein Fenster hoch ploppt.

    Spoiler anzeigen
    [autoit]

    #include "_XMLDomWrapper.au3"
    _XMLFileOpen(@ScriptDir & '\XMLTestfile.xml')
    ConsoleWrite(String(@error) & @CRLF)
    _XMLTransform($objDoc.xml) ;, "", @ScriptDir & "\XMLJUHU.xml")
    FileWrite('XMLjuhu.xml', $objDoc.xml)

    [/autoit]

    Anbei 1 von 7 möglichen xml-Dateien in Zip verpackt.

    Hab Dank
    Mike

  • Hab mal ein wenig rumgespielt, aber so ganz fehlerfrei ist das so nicht und vermutlich auch ein etwas falscher Ansatz. Vielleicht hilft dir das ja trotzdem weiter oder du findest raus was da im einzelnen schief löuft. Habe jedenfalls keine Lust mehr im Moment:

    Spoiler anzeigen
    [autoit]


    #include <file.au3>
    #include <array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $File = @ScriptDir & "\XMLTestfile.xml"
    Global $output = @ScriptDir & "\XMLTestfile_formated.xml"
    Global $aFile

    [/autoit] [autoit][/autoit] [autoit]

    $sFile = FileRead($File)
    $sFile = StringReplace($sFile,@LF,"")
    $sFile = StringReplace($sFile,@CR,"")
    $sFile = StringReplace($sFile,"><",">" & @LF & "<")
    $aFile = StringSplit($sFile,@LF)

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($aFile)

    [/autoit] [autoit][/autoit] [autoit]

    Global $sektions[$aFile[0]]
    $k=0
    for $i=2 to $aFile[0]
    for $j=$i+1 to $aFile[0]
    if StringLeft($aFile[$j],2) = "</" and StringInStr($aFile[$j],StringTrimLeft(StringReplace($aFile[$i],@TAB,""),1)) Then
    $sektions[$k]=$i & "/" & $j
    $k+=1
    ExitLoop
    EndIf
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    for $i=1 to $aFile[0]
    if $sektions[$i-1]="" Then ExitLoop
    $temp=StringSplit($sektions[$i-1],"/")
    $start=$temp[1]+1
    $end=$temp[2]-1
    for $j=$start to $end
    $aFile[$j]=@TAB & $aFile[$j]
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($sektions)
    _FileWriteFromArray($output,$aFile,1)

    [/autoit]
  • Der Parse Error dürfte btw davon kommen:

    Code
    Leerzeichen oder "?" erwartet. Fehler beim Bearbeiten der Ressource 'file:///F:/XMLTestfile.xml'. Zeile 2, Position 31 
    
    
    version="1.0" encoding="utf-8"><list><email><domain name="email"><pool><entry
    ---------------...
    Code
    Falsch/Richtig:
    <?xml version="1.0" encoding="utf-8">
    <?xml version="1.0" encoding="utf-8"?>

    Dann wird die XML zumindestens im Internet Explorer korrekt dargestellt.

  • Hab Dank misterspeed für Deine Mühen und den Code! Super!

    Da ich nicht mehr der Schnellste und auch kein gelernter Informatiker bin, verstehe ich den Code nicht auf den ersten Blick. Ich versuche mich einzuarbeiten und melde mich wieder. Hoffentlich mit fehlerfreiem Code.

    Habt Dank!
    Mike

    PS: Die xml-Dateien bekomme ich so. Die stammen nicht von mir und darauf habe ich auch keinen Einfluss. Ich muss damit zurecht kommen.

  • Warum hast du da keinen Einfluss drauf? Sofern es wirklich nur am XML Kopf scheitert würde ich in Betracht ziehen diesen String ganz zu Beginn ersetzten zu lassen (fileread,stringreplace,filewrite) und dann mal schaun ob die xmlwrapper Funktion danach damit zurecht kommt. Kann ich nur nicht testen, weil du die notwendige xml UDF nicht verlinkt oder angehängt hast und ich zu faul bin danach zu suchen. Dürfte jedenfalls leichter sein als meinen hingerotzten, fehlerhaften code zu überarbeiten den ich selbst nicht mehr ganz verstehe. :P

  • Entschuldigung wegen dem XML DOM Wrapper. Ich dachte, der wäre allgemein bekannt. Hier der Link: XML DOM Wrapper

    Ich maße mir nicht an, mangels Kenntnis, ob das xml valid ist oder nicht. Ich möchte es nur lesbar aufbereiten, aber nicht verändern.

    Wenn es wirklich nur das eine Fragezeichen wäre, könnte ich es ja vorher einfügen, dann mit _XMLTransform ggf. aufbereiten und dann beim Rausschreiben wieder das Fragezeichen entfernen. Ich bin mir nicht sicher, ob ich das nach Deinem Post von gestern Abend nicht noch ausprobiert habe. Ich werde es jedenfalls morgen nachholen.

    Hab Dank!
    Mike

  • Kurze Zwischenmeldung:

    _XMLFileOpen, _XMLTransform und _XMLSaveDoc machen aus der xml-Datei einen Zweizeiler, wenn man das fehlende Fragezeichen in der Headerzeile ergänzt. Aber das ist genau das Gegenteil von dem was ich eigentlich will. Zeile 1 ist die Headerzeile. In Zeile 2 steht dann die xml-Daten. Somit nicht mehr einfach lesbar.

    Kommende Woche arbeite ich mich in Deinen Code ein oder schreibe selber was. Allerdings wundert mich, dass es dafür keine fertige Lösung geben soll.

    Habt Dank!
    Mike