EDIT: Post #7 mit Zwischenlösung und neuer Problemstellung
Hallo Community 【ツ】 ,
ich muss ein klein wenig ausholen: Ich habe ein Word-Dokument, welches nicht mehr geöffnet werden kann (*.docx). Ich habe dieses Dokument entpackt, via "7z", da dies ja auch "nur" XML-Dateien etc. enthält. In diesem Archiv ist eine "document.xml" enthalten, welche fehlerhafte Start- bzw. Endtags enthält. Sprich die Anzahl der öffnenden und schließenden TAGs stimmt nicht überein.
Woher ich dies weiß? Da ich nach der Fehlermeldung suchte, die Word ausgab - Ergebnis: https://support.microsoft.com/de-de/kb/2528942. Es besteht über eine FixIt-EXE von MS die Möglichkeit, solche Word-Dokumente reparieren zu lassen, was jedoch auch manuell getan werden kann.
Damit komme ich nun zu meiner Frage bzw. zum Problem:
Wie kann ich jedem öffnenden Starttag den passenden Endtag zuordnen, bzw. wenn ein Endtag fehlen sollte, diese Information (also Tag-Name und Position in der Datei) anzeigen? Die Datei zu parsen ist meine erste Idee, da die komplette Datei (im Anhang als "Unvalid.xml" bezeichnet) in keinem sinnvoll zu lesenden Format aufgebaut ist. Sprich es sind alle TAGs aneinander oder anders, es gibt keine Zeilenumbrüche (@CRLF bzw. \r\n) in der Datei.
1. Bitte schaut euch zunächst die "Unvalid.xml" an (ich nutze Notepad++).
2. Folgender Code um eine Übersicht zu erhalten.
Übersicht der XML-Datei via Arrays:
Spoiler anzeigen
; ------------------------------------------------------------------------------; Au3_XmlCheck; ------------;; Über die DEBUG-Bereiche, gebe ich mir zunächst eine Übersicht (in Form von; Arrays aus, damit ich die TAGs analysieren kann).; ------------------------------------------------------------------------------#region includes#include <Array.au3>#endregion#region declarationLocal $sXmlFile = @ScriptDir & '\Unvalid.xml'Local $sXmlFileFormatted = @ScriptDir & '\Formatted.xml'Local $aStartTag[1], $aEndTag[1], $aMixedTag[1]#endregion#region init$hFile = FileOpen( $sXmlFile, 0 )$sRead = FileRead( $hFile )FileClose( $hFile )#endregion#region processingLocal $sFormatted = StringReplace( $sRead, '><', '>' & @CRLF & '<', 0 )$aFormatted = StringSplit( $sFormatted, @LF, 1 ); write new fileFileClose( FileWrite( FileOpen( $sXmlFileFormatted, 2 + 8 ), $sFormatted ) ); DEBUG_ArrayDisplay( $aFormatted, 'All' ) ; 14749 rowsFor $i = 1 To $aFormatted[0] Step 1 If StringInStr( $aFormatted[$i], '/>' ) <> 0 Then ; row number and <TAG /> _ArrayAdd( $aMixedTag, $i & '|' & $aFormatted[$i] ) ElseIf StringInStr( $aFormatted[$i], '</' ) <> 0 Then ; row number and </TAG> _ArrayAdd( $aEndTag, $i & '|' & $aFormatted[$i] ) Else ; row number and <TAG> _ArrayAdd( $aStartTag, $i & '|' & $aFormatted[$i] ) EndIfNext; DEBUG_ArrayDisplay( $aStartTag, 'Start' ) ; 4502 rows_ArrayDisplay( $aEndTag, 'End' ) ; 5328 rows_ArrayDisplay( $aMixedTag, 'Mixed' ) ; 4964 rows#endregion
[/autoit]
Wie sollte ich weiter vorgehen, um tatsächlich die nicht passenden TAGs zu finden? Gibt es evtl. entsprechende UDFs dafür (abgesehen von der "_XMLDomWrapper.au3", die mir nicht viel hilft)? Kann mir bitte jemand auf die Spünge helfen, wie man dieses Problem sinnvoll angeht bzw. umsetzt?
Anhang:
- Unvalid.xml.txt (Originaldatei)
- Formatted.xml.txt (geht aus dem Skript heraus)
- ".txt" kann weg (nur damit ich diese hier anhängen konnte)
Vielen Dank für etwaige Unterstützung (Ideen, Verbesserungsvorschläge, Kritik und Zustimmung).
Einen angenehmen Tag noch!
UserIsGrateful 【ツ】