Frage

Ich bin mit der javax.xml.transform.Transformer Klasse einiger XSLT Übersetzungen auszuführen, etwa so:

TransformerFactory factory = TransformerFactory.newInstance();
StreamSource source = new StreamSource(TRANSFORMER_PATH);
Transformer transformer = factory.newTransformer(source);
StringWriter extractionWriter = new StringWriter();
String xml = FileUtils.readFileToString(new File(sampleXmlPath));
transformer.transform(new StreamSource(new StringReader(xml)),
        new StreamResult(extractionWriter));
System.err.println(extractionWriter.toString());

Doch egal, was ich tue, kann ich nicht der Transformator keine Tabs zu vermeiden, scheinen mit konvertieren, die in ihrer Zeichenentität Äquivalent (	) im Quelldokument waren. Ich habe beide versucht:

transformer.setParameter("encoding", "UTF-8");

und

transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");

aber keiner von denen helfen. Hat jemand irgendwelche Vorschläge? Denn:

&#9;&#9;&#9;&#9;&#9;<MyElement>

wirklich dumm aussieht (auch wenn es funktioniert).

War es hilfreich?

Lösung

Die Antwort auf diese entpuppte ziemlich lahm: update Xalan. Ich weiß nicht, was mit meiner alten Version nicht in Ordnung war, aber wenn ich auf die neueste Version geschaltet:    http://xml.apache.org/xalan-j/downloads.html plötzlich das Entity-Escaping von Tabs ging einfach weg. Vielen Dank allen für Ihre Hilfe though.

Andere Tipps

Sie könnten versuchen, eine SAXTransformerFactory in Kombination mit einem XMLReader verwendet wird.

So etwas wie:

SAXTransformerFactory transformFactory = (SAXTransformerFactory) TransformerFactory.newInstance();
StreamSource source = new StreamSource(TRANSFORMER_PATH);
StringWriter extractionWriter = new StringWriter();

TransformerHandler transformerHandler = null;
try {
    transformerHandler = transformFactory.newTransformerHandler(source);
    transformerHandler.setResult(new StreamResult(extractionWriter));
} catch (TransformerConfigurationException e) {
    throw new SAXException("Unable to create transformerHandler due to transformer configuration exception.");
}

XMLReader reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
reader.setContentHandler(transformerHandler);
reader.parse(new InputSource(new FileReader(xml)));
System.err.println(extractionWriter.toString());

Es sollte möglich sein, die SAX-Parser nicht gesetzt nicht relevanten Leerzeichen enthalten, wenn es nicht bereits tut sie standardmäßig aktiviert. Ich habe nicht wirklich diese getestet, aber ich habe etwas Ähnliches in einem meiner Projekte.

Manchmal mit Dingen wie diese, so dass sie sich mit regex ersetzen danach ist keine ganz schlechte Option, die zumindest bekommt man, bis Sie eine bessere Option später finden.

Gibt es einen Grund, warum Sie die Datei in einen String liest zuerst statt direkt mit einem Datei-Stream?

Anstelle von

String xml = FileUtils.readFileToString(new File(sampleXmlPath));
transformer.transform(new StreamSource(new StringReader(xml)),
    new StreamResult(extractionWriter));

Sie könnten versuchen,

transformer.transform(new StreamSource(new FileReader(sampleXmlPath)),
    new StreamResult(extractionWriter));

Das kann nicht die Ursache des Problems sein, aber ich habe es ähnliche Probleme gesehen verursacht vor. Wenn Ihr FileUtils.readFileToString die Commons.IO Version, es liest die Zeichenfolge in als UFT-16 (der Java Standard, IIRC) statt, was Sie wollen, die UTF-8 ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top