XMLStreamWriter: Einrückung
gibt es wirklich keine Möglichkeit, direkt zu schreiben formatierte XML mit javax.xml.stream.XMLStreamWriter (Java SE 6)??? Das ist wirklich unglaublich, wie andere XML-APIs wie JAXB und einige DOM-Bibliotheken sind in der Lage, dies zu tun. Auch die .NET XMLStreamWriter-äquivalent ist in der Lage, diese AFAIK (wenn ich mich richtig erinnere ist die Klasse System.Xml.XmlTextWriter).
Bedeutet dies, die einzige option die ich habe, ist neu Parsen der XML zu generieren, formatierte Ausgabe??
E. g.:
StringWriter sw = new StringWriter();
XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newFactory();
XMLStreamWriter xmlStreamWriter = xmlOutputFactory.createXMLStreamWriter(sw);
writeXml(xmlStreamWriter);
xmlStreamWriter.flush();
xmlStreamWriter.close();
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
StringWriter formattedStringWriter = new StringWriter();
transformer.transform(new StreamSource(new StringReader(sw.toString())), new StreamResult(formattedStringWriter));
System.out.println(formattedStringWriter);
Das problem mit dieser Lösung ist die Eigenschaft "{http://xml.apache.org/xslt}indent-amount". Ich fand keine Dokumentation darüber und es scheint nicht garantiert werden tragbar sein.
Also, welche anderen Möglichkeiten habe ich, wenn ich will, um dies mit standard-Java 6 Klassen? Erstellen Sie eine JAXB-oder DOM-Objekt-graph nur für pretty-printing??
InformationsquelleAutor der Frage Puce | 2011-01-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fügen Sie den erforderlichen code zu formatieren Sie Ihr Dokument in Ihrem writeXml Methode. Einfach zu halten eine Tiefe counter (an den Ebenen der Verschachtelung). Dann, bevor Sie writeStartElement und nachdem Sie writeEndElement verwenden die Tiefe-index zum einfügen eines Einzugs.
InformationsquelleAutor der Antwort Blaise Doughan
Genau dieses Frage beantwortet wurde vor einigen Monaten und eine der Antworten ist die Verwendung der IndentingXMLStreamWriter Klasse:
Es ist eine saubere Lösung, so weit als der code geht, aber Vorsicht: dies ist ein com.Sonne.* Klasse, es gibt keine Garantie der Allgemeinen Verfügbarkeit...
InformationsquelleAutor der Antwort Tomislav Nakic-Alfirevic
Mit Spring Batch, erfordert dies eine Unterklasse seit dieser JIRA-BATCH-1867
Aber dies erfordert einen zusätzlichen Abhängigkeit, da Spring Batch beinhaltet nicht den code zum Einzug der StAX-Ausgang:
InformationsquelleAutor der Antwort Sebastien Lorber
Nur für das Protokoll, Sächsische ermöglicht es Ihnen, einen serialisieren XMLStreamWriter durch die s9api Schnittstelle:
und der Serializer macht alle die XSLT-definierten output-Eigenschaften (einschließlich der "Gedankenstrich") plus einige Saxon-spezifisch.
InformationsquelleAutor der Antwort Michael Kay
Habe ich keine Antwort in Anbetracht
"{http://xml.apache.org/xslt}indent-amount"
Eigenschaft. Aber Sie können Transformatoren etwas portabel, ohne die Notwendigkeit reparse all-Ausgang. Sie können so etwas wie den folgenden code zum erstellen von pretty-printingXMLStreamWriter
.InformationsquelleAutor der Antwort Victor Nazarov
Sind Sie richtig, dass der standard java.xml Schnittstellen bieten wenig bis gar keine Kontrolle über die Serialisierung, obwohl die zugrunde liegende Implementierung (Apache Xerces). Ich habe dieses problem zu lösen und das beste, das ich kam, war, eine Kopie des Xerces und verwenden Sie die
org.apache.xml.serialize
Klassen.InformationsquelleAutor der Antwort Jim Garrison