Ich habe eine Java-Zeichenfolge, die XML enthält, ohne Zeilenvorschübe oder Einrückungen. Ich möchte daraus einen String mit schön formatiertem XML machen. Wie mache ich das?
String unformattedXml = "<tag><nested>hello</nested></tag>";
String formattedXml = new [UnknownClass]().format(unformattedXml);
Hinweis: Meine Eingabe ist eine Zeichenfolge . Meine Ausgabe ist ein String .
(Grund-) Scheinergebnis:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<tag>
<nested>hello</nested>
</tag>
</root>
java
xml
pretty-print
Steve McLeod
quelle
quelle
Antworten:
Hinweis: Die Ergebnisse können je nach Java-Version variieren. Suchen Sie nach plattformspezifischen Problemumgehungen.
quelle
<?xml version="1.0" encoding="UTF-8"?>
?<?xml ...>
Deklaration wegzulassen , fügen Sietransformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes")
doc
definiert?Hier ist eine Antwort auf meine eigene Frage. Ich habe die Antworten aus den verschiedenen Ergebnissen kombiniert, um eine Klasse zu schreiben, die hübsch XML druckt.
Keine Garantie dafür, wie es mit ungültigem XML oder großen Dokumenten reagiert.
quelle
writer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);
nach derLSSerializer writer = ...
Zeile hinzu.document
initialisiert wurde, daher dachte ich, ich könnte die Verzögerung hinzufügen und ein kurzes Beispiel daraus machen. Lassen Sie mich wissen , wenn ich etwas ändern sollte, pastebin.com/XL7932aCEine einfachere Lösung basierend auf dieser Antwort :
Testfall:
kehrt zurück:
quelle
factory.setAttribute("indent-number", 4);
und jetzt funktioniert es.<?xml version="1.0" encoding="UTF-8"?>
?transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
<?xml version="1.0" encoding="UTF-8"?><root>
ist alles in einer Zeile. Irgendwelche Ideen warum?transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "yes");
hat bei mir funktioniert.Jetzt ist es 2012 und Java kann mehr als früher mit XML. Ich möchte meiner akzeptierten Antwort eine Alternative hinzufügen. Dies hat keine Abhängigkeiten außerhalb von Java 6.
quelle
Nur um zu beachten, dass die am besten bewertete Antwort die Verwendung von xerces erfordert.
Wenn Sie diese externe Abhängigkeit nicht hinzufügen möchten, können Sie einfach die Standard-JDK-Bibliotheken verwenden (die tatsächlich intern mit xerces erstellt werden).
NB Es gab einen Fehler mit jdk Version 1.5, siehe http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446 , der jetzt behoben ist.
(Hinweis: Wenn ein Fehler auftritt, wird der Originaltext zurückgegeben.)
quelle
Ich habe in der Vergangenheit mit der Methode org.dom4j.io.OutputFormat.createPrettyPrint () ziemlich gedruckt
quelle
prettyPrintedString.replaceAll("\\s+\n", "\n")
Hier ist eine Möglichkeit, dies mit dom4j zu tun :
Importe:
Code:
quelle
<?xml version...
in einer Zeile und alles andere in einer anderen Zeile.Da Sie mit a beginnen
String
, müssen Sie einDOM
Objekt (z. B.Node
) verdecken, bevor Sie das verwenden könnenTransformer
. Wenn Sie jedoch wissen, dass Ihre XML-Zeichenfolge gültig ist, und Sie nicht den Speicheraufwand für das Parsen einer Zeichenfolge in ein DOM aufbringen möchten, führen Sie eine Transformation über das DOM aus, um eine Zeichenfolge zurückzugewinnen Zeichen für Zeichen analysieren. Fügen Sie nach jedem</...>
Zeichen eine neue Zeile und Leerzeichen ein , behalten Sie den Zähler bei und rücken Sie ihn ein (um die Anzahl der Leerzeichen zu bestimmen), die Sie für jedes Zeichen erhöhen und<...>
für jedes, das</...>
Sie sehen, verringern .Haftungsausschluss - Ich habe die folgenden Funktionen ausgeschnitten / eingefügt / Text bearbeitet, sodass sie möglicherweise nicht so kompiliert werden, wie sie sind.
quelle
Wenn die Verwendung einer XML-Bibliothek eines Drittanbieters in Ordnung ist, können Sie mit etwas wesentlich Einfacherem davonkommen, als es die derzeit am höchsten bewerteten Antworten vermuten lassen.
Es wurde angegeben, dass sowohl Eingabe als auch Ausgabe Zeichenfolgen sein sollten. Hier ist eine Dienstprogrammmethode, die genau das tut und mit der XOM- Bibliothek implementiert wird :
Ich habe getestet, dass es funktioniert, und die Ergebnisse hängen nicht von Ihrer JRE-Version oder Ähnlichem ab. Schauen Sie sich das an, um zu sehen, wie Sie das Ausgabeformat nach Ihren Wünschen anpassen können
Serializer
API an .Dies kam tatsächlich länger heraus als ich dachte - einige zusätzliche Zeilen wurden benötigt, weil man schreiben
Serializer
möchteOutputStream
. Beachten Sie jedoch, dass hier nur sehr wenig Code für das eigentliche XML-Twiddling vorhanden ist.(Diese Antwort ist ein Teil meiner Bewertung von XOM, die wurden vorgeschlagen als eine Option in meiner Frage über die beste Java XML - Bibliothek dom4j ersetzen Für die Aufzeichnung mit dom4j Sie dies erreichen könnten mit ähnlicher Leichtigkeit verwenden.
XMLWriter
UndOutputFormat
. Bearbeiten : .. .Wie in demonstrierte mlo55 Antwort .)quelle
Kevin Hakanson sagte: "Wenn Sie jedoch wissen, dass Ihre XML-Zeichenfolge gültig ist und Sie nicht den Speicheraufwand für das Parsen einer Zeichenfolge in ein DOM aufbringen möchten, führen Sie eine Transformation über das DOM aus, um eine Zeichenfolge zurückzugewinnen Führen Sie einfach ein altmodisches Zeichen durch Zeichenanalyse durch. Fügen Sie nach jedem Zeichen eine neue Zeile und Leerzeichen ein, behalten Sie den Zähler bei und rücken Sie ihn ein (um die Anzahl der Leerzeichen zu bestimmen), die Sie für jedes <...> erhöhen und für jedes, das Sie sehen, verringern. "
Einverstanden. Ein solcher Ansatz ist viel schneller und weist weitaus weniger Abhängigkeiten auf.
Beispiellösung:
quelle
Hmmm ... hat so etwas gesehen und es ist ein bekannter Fehler ... füge einfach diese OutputProperty hinzu.
Hoffe das hilft ...
quelle
In Bezug auf den Kommentar "Sie müssen zuerst einen DOM-Baum erstellen": Nein, das müssen und sollten Sie nicht tun.
Erstellen Sie stattdessen eine StreamSource (neue StreamSource (neuer StringReader (str)) und geben Sie diese an den genannten Identitätstransformator weiter. Dieser verwendet den SAX-Parser und das Ergebnis ist viel schneller. Das Erstellen eines Zwischenbaums ist in diesem Fall ein reiner Aufwand. Ansonsten ist die Antwort mit dem höchsten Rang gut.
quelle
Scala verwenden:
Sie können dies auch in Java tun, wenn Sie von der Datei scala-library.jar abhängig sind. Es sieht aus wie das:
Das
PrettyPrinter
Objekt besteht aus zwei Ints, wobei das erste die maximale Zeilenlänge und das zweite der Einrückungsschritt ist.quelle
leicht verbesserte Version von milosmns ...
quelle
} else if (row.startsWith("</")) {
Teil dazu ändern :else if (row.startsWith("</")) { String indent = repeatIdent(--stack); if (pretty.charAt(pretty.length() - 1) == '\n') { pretty.append(indent + row + "\n"); } else { pretty.append(row + "\n"); } }
Hier ist eine Lösung, die für mich funktioniert hat (dank eines Kommentars, den @George Hawkins in einer der Antworten gepostet hat):
quelle
Wenn Sie sicher sind, dass Sie über ein gültiges XML verfügen, ist dieses einfach und vermeidet XML-DOM-Bäume. Vielleicht hat ein paar Fehler, kommentieren Sie, wenn Sie etwas sehen
quelle
Alle oben genannten Lösungen haben bei mir nicht funktioniert, dann fand ich diese http://myshittycode.com/2014/02/10/java-properly-indenting-xml-string/
Der Hinweis ist, Leerzeichen mit XPath zu entfernen
quelle
Dieser Code unten funktioniert einwandfrei
quelle
Ich mische sie alle und schreibe ein kleines Programm. Es liest aus der XML-Datei und druckt aus. Geben Sie statt xzy Ihren Dateipfad an.
quelle
Nur eine andere Lösung, die für uns funktioniert
quelle
Verwenden von jdom2: http://www.jdom.org/
quelle
Als Alternative zu den Antworten von max , codeskraps , David Easley und milosmns , haben einen Blick auf meine leicht, High-Performance - pretty-Drucker Bibliothek: xml-Formatierer
Manchmal, wie beim Ausführen von verspotteten SOAP-Diensten direkt aus einer Datei, ist es gut, einen hübschen Drucker zu haben, der auch bereits hübsch gedrucktes XML verarbeitet:
Wie einige kommentiert haben, ist das hübsche Drucken nur eine Möglichkeit, XML in einer besser lesbaren Form darzustellen - Leerzeichen gehören streng genommen nicht in Ihre XML-Daten.
Die Bibliothek ist für das hübsche Drucken zu Protokollierungszwecken vorgesehen und enthält auch Funktionen zum Filtern (Entfernen / Anonymisieren von Teilbäumen) und zum hübschen Drucken von XML in CDATA- und Textknoten.
quelle
Ich hatte das gleiche Problem und habe großen Erfolg mit JTidy ( http://jtidy.sourceforge.net/index.html ).
Beispiel:
quelle
Unterstrich-Java hat statische Methode
U.formatXml(string)
. Ich bin der Betreuer des Projekts. Live BeispielAusgabe:
quelle
Es gibt ein sehr nettes Befehlszeilen-XML-Dienstprogramm namens xmlstarlet ( http://xmlstar.sourceforge.net/). ), das viele Dinge tun kann, die viele Leute benutzen.
Sie können dieses Programm programmgesteuert mit Runtime.exec ausführen und dann die formatierte Ausgabedatei einlesen. Es bietet mehr Optionen und eine bessere Fehlerberichterstattung, als einige Zeilen Java-Code bieten können.
Laden Sie das xmlstarlet herunter: http://sourceforge.net/project/showfiles.php?group_id=66612&package_id=64589
quelle
Ich habe festgestellt, dass sich in Java 1.6.0_32 die normale Methode zum hübschen Drucken einer XML- Zeichenfolge (unter Verwendung eines Transformer mit einer Null oder einer Identität xslt) nicht so verhält, wie ich es gerne hätte, wenn Tags nur durch Leerzeichen getrennt würden, anstatt keine Trennung zu haben Text. Ich habe versucht,
<xsl:strip-space elements="*"/>
in meiner Vorlage ohne Erfolg zu verwenden. Die einfachste Lösung, die ich gefunden habe, bestand darin, den Speicherplatz mithilfe eines SAXSource- und XML-Filters so zu entfernen, wie ich es wollte. Da meine Lösung die Protokollierung war, habe ich diese auch erweitert, um mit unvollständigen XML-Fragmenten zu arbeiten. Beachten Sie, dass die normale Methode gut zu funktionieren scheint, wenn Sie eine DOMSource verwenden, aber ich wollte diese wegen der Unvollständigkeit und des Speicheraufwands nicht verwenden.quelle
Die Lösungen, die ich hier für Java 1.6+ gefunden habe, formatieren den Code nicht neu, wenn er bereits formatiert ist. Das, was für mich funktioniert hat (und bereits formatierten Code neu formatiert hat), war das Folgende.
Es ist ein gutes Werkzeug, das Sie in Ihren Komponententests für den XML-Vergleich mit vollständigen Zeichenfolgen verwenden können.
quelle
Für diejenigen, die nach einer schnellen und schmutzigen Lösung suchen - für die XML nicht zu 100% gültig sein muss. zB bei REST / SOAP-Protokollierung (man weiß nie, was die anderen senden ;-))
Ich habe einen Code gefunden und weiterentwickelt, den ich online gefunden habe und der meiner Meinung nach hier noch als gültiger möglicher Ansatz fehlt:
Hier ist die Ausgabe:
quelle
Ich habe eine Antwort mit gesehen
Scala
, also hier eine andereGroovy
für den Fall, dass jemand sie interessant findet. Der Standardeinzug ist 2 Schritte. DemXmlNodePrinter
Konstruktor kann auch ein anderer Wert übergeben werden.Verwendung von Java, wenn sich groovy jar im Klassenpfad befindet
quelle
Falls Sie nicht so viel Einrückung benötigen, sondern nur ein paar Zeilenumbrüche, kann es ausreichen, einfach eine Regex zu erstellen ...
Der Code ist nett, nicht das Ergebnis wegen fehlender Einrückung.
(Lösungen mit Einrückung finden Sie in anderen Antworten.)
quelle