====== XML lesbar formatieren ====== 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, "" ); 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 ); // 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. Pos = StrFind( XML, ">", ++Pos ); // um einen TAG verschieben ELSEIF( StrFind( XML, "/", nextOpenTag ) != nextOpenTag+1 ) // nächstes TAG ist KEIN schliessendes TAG: "