Nice bit of code to format an xml string
Asked Answered
P

5

16

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

eg

<XML><TAG1>A</TAG1><TAG2><Tag3></Tag3></TAG2></XML>

and will return nicely formatted String in return after inserting linebreaks and tabs or spaces?

Pleo answered 24/10, 2008 at 15:38 Comment(0)
K
16

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

Krenn answered 25/10, 2008 at 4:24 Comment(0)
B
10

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.

Bensen answered 24/10, 2008 at 15:50 Comment(0)
R
4

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>
Recitativo answered 24/10, 2008 at 15:51 Comment(1)
PS - This will collapse <Tag3></Tag3> to <Tag3/>.Recitativo
G
4

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;
Garnish answered 30/10, 2008 at 4:40 Comment(0)
K
1

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.

Keshiakesia answered 24/10, 2008 at 16:22 Comment(2)
you should have looked it up before answering :)Perorate
Don't always have time, but it would have been nice.Keshiakesia

© 2022 - 2024 — McMap. All rights reserved.