4 Stimmen

Regex zum Einrücken einer XML-Datei

Ist es möglich, eine REGEX (search replace) zu schreiben, die, wenn sie auf einer XML-Zeichenkette ausgeführt wird, diese XML-Zeichenkette schön eingerückt ausgibt?

Wenn ja, wie lautet der REGEX :)

5voto

Greg Punkte 306033

Dies wäre viel, viel einfacher, wenn Sie keine Regex verwenden würden. In der Tat bin ich nicht einmal sicher, dass es mit Regex möglich ist.

Die meisten Sprachen verfügen über XML-Bibliotheken, die diese Aufgabe sehr einfach machen würden. Welche Sprache verwenden Sie?

5voto

bobince Punkte 512550

Ist es möglich, einen REGEX (search replace) zu schreiben, der, wenn er auf eine XML-Zeichenkette [...anything]

Nein.

Verwenden Sie einen XML-Parser, um die Zeichenkette zu lesen, und dann einen XML-Serialisierer, um sie im "hübschen" Modus wieder auszuschreiben.

Jeder XML-Prozessor hat seine eigenen Optionen, so dass es von der Plattform abhängt, aber hier ist der etwas langatmige Weg, der bei DOM Level 3 LS-konformen Implementierungen funktioniert:

input= implementation.createLSInput();
input.stringData= unprettyxml;
parser= implementation.createLSParser(implementation.MODE_SYNCHRONOUS, null);
document= parser.parse(input);
serializer= implementation.createLSSerializer();
serializer.domConfig.setParameter("format-pretty-print", true);
prettyxml= serializer.writeToString(document);

3voto

Eddie Punkte 52504

Ich weiß nicht, ob ein Regex für sich genommen ein hübsches Druckformat für eine beliebige XML-Eingabe erstellen kann. Man bräuchte einen Regex, der von einem Programm angewandt wird, um ein Tag zu finden, die passenden schließenden Tags zu finden (wenn das Tag nicht selbst geschlossen ist), und so weiter. Die Verwendung von Regex zur Lösung dieses Problems ist wirklich das falsche Werkzeug für diese Aufgabe. Die einfachste Möglichkeit, XML hübsch auszudrucken, besteht darin, einen XML-Parser zu verwenden, ihn einzulesen, geeignete Serialisierungsoptionen zu setzen und das XML dann wieder zu serialisieren.

Warum wollen Sie Regex verwenden, um dieses Problem zu lösen?

3voto

Emmanuel Rodriguez Punkte 1544

Die Verwendung einer Regex für diese wird ein Alptraum sein. Die Einrückungsebene auf der Grundlage der Hierarchie der Knoten im Auge zu behalten, wird fast unmöglich sein. Vielleicht könnte die reguläre Ausdrucks-Engine von Perl 5.10 helfen, da sie jetzt reentrant ist. Aber lassen Sie uns diesen Weg nicht gehen... Außerdem müssen Sie CDATA-Abschnitte berücksichtigen, die XML-Deklarationen einbetten können, die von der Einrückung ignoriert und intakt gehalten werden müssen.

Bleiben Sie bei DOM. Wie in der anderen Antwort vorgeschlagen wurde, bieten einige Bibliotheken bereits eine Funktion, die einen DOM-Baum für Sie einrücken wird. Falls nicht, ist die Erstellung einer solchen Funktion viel einfacher als die Erstellung und Pflege von Regexen, die die gleiche Aufgabe erfüllen.

2voto

Zorglub Punkte 21

Die dunkle Voodoo-Regexp wie hier beschrieben funktioniert hervorragend.
http://www.perlmonks.org/?node_id=261292
Der Hauptvorteil gegenüber der Verwendung von XML::LibXMl und anderen ist, dass es um eine Größenordnung schneller ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X