Mit DOCUcontrol erstellte XML-Dateien werden beim Umwandeln in eine Zeichenkette generell unformatiert in eine Zeile umgewandelt. Da diese Ansicht sehr unübersichtlich ist habe ich ein benanntes Makro erstellt, mit welchem ein XML in einem lesbaren Format ausgegeben wird. Der erste (referenzierte) Parameter ist das XML als STRING. Nach Makro-Aufruf ist der Inhalt dieser Variable formatiert. Als zusätzlichen, optionalen, Parameter kann ein Tag-Name für ein Passwort-Tag übergeben werden. Dieser wird in der formatierten Ausgabe dann durch Sternchen (*) ersetzt.
VOID XMLAddCrLf( STRING &XML, STRING PasswortElement = "Passwort" )
INT Pos = 0, nextOpenTag, nextCloseTag;
INT PasswortLength, PasswortStart, PasswortEnd;
STRING Fill, Passwort;
IF( !StrIsEmpty( XML ) )
IF( !StrIsEmpty( PasswortElement ) ) // wenn ein Element-Name für ein Passwort übergeben wurde
PasswortLength = StrGetLength( PasswortElement ); // Länge des Elements ermitteln
PasswortStart = StrFind( XML, "<" + PasswortElement + ">" ) + PasswortLength + 2;
PasswortEnd = StrFind( XML, "</" + PasswortElement + ">" );
Passwort = StrMid( XML, PasswortStart, PasswortEnd - PasswortStart );
PasswortLength = StrGetLength( Passwort ); // Länge des Passworts ermitteln
StrFormatLeft( Fill, PasswortLength, '*' ); // Länge der Füllzeichen festlegen
StrReplaceStr( XML, Passwort, Fill ); // Passwort gegen Füllzeichen ersetzen
ENDIF
Pos = StrFind( XML, "<", Pos ); // ersten TAG suchen
IF( Pos > 0 ) // ersten öffnender TAG gefunden
REPEAT // jeden TAG einen Durchlauf
IF( StrFind( XML, "?", Pos ) == Pos+1 ) // Eröffnungs-TAG: "<?"
Pos = StrFind( XML, "<", ++Pos ); // zum Anfang des nächsten öffnenden TAGs springen
ELSEIF( StrFind( XML, "/", Pos ) == Pos+1 ) // schliessendes TAG: "</"
Pos = StrFind( XML, ">", Pos ); // Ende des TAGs finden
StrInsert( XML, ++Pos, "\r\n" ); // Zeilenumbruch an aktueller Position einfügen
ELSE // öffnendes oder alleinstehendes TAG: "<"
nextOpenTag = StrFind( XML, "<", Pos+1 ); // Anfang des nächsten TAG's finden
nextCloseTag = StrFind( XML, ">", nextOpenTag ); // Ende des nächsten TAG's finden
Pos = StrFind( XML, ">", ++Pos ); // Ende des TAG's finden
IF( StrFind( XML, "/>", nextCloseTag-1 ) == nextCloseTag-1 ) // alleinstehendes TAG wie z. B. <WEIBLICH/>
Pos = StrFind( XML, ">", ++Pos ); // um einen TAG verschieben
ELSEIF( StrFind( XML, "/", nextOpenTag ) != nextOpenTag+1 ) // nächstes TAG ist KEIN schliessendes TAG: "</"
StrInsert( XML, ++Pos, "\r\n" ); // Zeilenumbruch an aktueller Position einfügen
ENDIF
ENDIF
Pos = StrFind( XML, "<", Pos ); // zum Anfang des nächsten TAGs springen
UNTIL( Pos == -1 ) // solange "<" gefunden werden
ENDIF
ENDIF
RETURN();