2008-10-24 6 views
15

Jeder hat eine fertige Funktion, die eine XML-Zeichenfolge und eine korrekt eingerückte Zeichenfolge zurückgibt?Schönes Bit zum Formatieren einer XML-Zeichenfolge

zB

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

und schön formatiert String im Gegenzug zurück, nachdem Zeilenumbrüche und Tabulatoren oder Leerzeichen eingefügt?

Antwort

15

Die RTL hat FormatXMLData in XMLDoc.pas, die Zeichenfolgen akzeptiert und zurückgibt.

10

OmniXML Verwendung:

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. 

Das Codefragment oben auf Public Domain freigegeben.

4

XSLT verwenden ...

<?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

PS - Dies wird- kollabieren. – dacracot

1

Das XML-Dokument DOM-Objekt bauen in Delphi hat eine ziemlich Formatierungsoption. Sie laden einfach Ihre XML-Datei in sie und speichern sie wieder, und wenn Sie diese Option eingestellt haben, macht es alles schön.

Ich werde es nachschlagen und diese Antwort aktualisieren.

+0

sollten Sie nachgeschlagen haben, bevor Sie antworten :) –

+0

Haben Sie nicht immer Zeit, aber es wäre schön gewesen. –

4

Ich habe Tidy mit libtidy von Michael Elsdörfer verwendet. Es gibt Ihnen eine Menge Optionen und Sie können sie extern für die Anwendung konfigurieren. Gilt auch für HTML.

Dies ist ein sehr grober Code, den ich verwendet habe. Mach damit, wie es dir gefällt.

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

Danke für die Korrektur, Bruce. –