Nice bit of code to format an xml string

前端 未结 5 1046
轮回少年
轮回少年 2021-02-05 12:55

Anyone got a ready made function that will take an XML string and return a correctly indented string?

eg

A

        
相关标签:
5条回答
  • 2021-02-05 13:18

    The XML Document DOM object build into Delphi has a pretty formatting option. You just load your XML into it and save it back out, and if you have that option set then it makes it all pretty.

    I'll look it up and update this answer.

    0 讨论(0)
  • 2021-02-05 13:22

    Using XSLT...

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="xml" indent="yes" />
        <xsl:template match="/">
            <xsl:copy-of select="."/>
        </xsl:template>
    </xsl:stylesheet>
    
    0 讨论(0)
  • 2021-02-05 13:36

    The RTL has FormatXMLData in XMLDoc.pas that accepts and returns strings.

    0 讨论(0)
  • 2021-02-05 13:36

    I have used Tidy with libtidy from Michael Elsdörfer. It give you heaps of options and you can configure them externally to the application. Also applicable to HTML.

    This is some very rough code that I used. Do with it as you please.

    function TForm1.DoTidy(const Source: string): string;
    var
      Tidy              : TLibTidy;
    begin
      if not TidyGlobal.LoadTidyLibrary('libtidy.dll') then
      begin
        //    Application.MessageBox('TidyLib is not available.', 'Error', 16);
        //    exit;
        raise Exception.Create('Cannot load TidyLib.dll');
      end;
      Tidy := TLibTidy.Create(Self);
      try
        Tidy.LoadConfigFile(ExtractFilePath(Application.ExeName) +
          'tidyconfig.txt');
        //    Tidy.Configuration.IndentContent := tsYes;
        //    Tidy.Configuration.IndentSpaces := 5;
        //    Tidy.Configuration.UpperCaseTags := False;
        //    Tidy.Configuration.NumEntities := True;
        //    Tidy.Configuration.AccessibilityCheckLevel := 2;
        //    Tidy.Configuration.InlineTags := 'foo,bar';
        //    Tidy.Configuration.XmlDecl := True;
        //    Tidy.Configuration.XmlTags := True;
        //    Tidy.Configuration.CharEncoding := TidyUTF8;
        //    Tidy.Configuration.WrapLen := 0;
        //    Tidy.SaveConfigFile('tidyconfig.txt');
        Tidy.ParseString(Source);
        Result := Tidy.RunDiagnosticsAndRepair;
      finally
        Tidy.Free;
      end;
    end;
    
    0 讨论(0)
  • 2021-02-05 13:40

    Using OmniXML:

    program TestIndentXML;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils,
      OmniXML,
      OmniXMLUtils;
    
    function IndentXML(const xml: string): string;
    var
      xmlDoc: IXMLDocument;
    begin
      Result := '';
      xmlDoc := CreateXMLDoc;
      if not XMLLoadFromAnsiString(xmlDoc, xml) then
        Exit;
      Result := XMLSaveToAnsiString(xmlDoc, ofIndent);
    end;
    
    begin
      Writeln(IndentXML('<XML><TAG1>A</TAG1><TAG2><Tag3></Tag3></TAG2></XML>'));
      Readln;
    end.
    

    The code fragment above is released to public domain.

    0 讨论(0)
提交回复
热议问题