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, "</" + 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();