Как вы предотвращаете выход Javax Transformer из пробелов? - PullRequest
2 голосов
/ 29 июня 2009

Я использую класс javax.xml.transform.Transformer для выполнения некоторых XSLT-переводов, например:

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());

Однако, независимо от того, что я делаю, я не могу избежать того, чтобы преобразователь преобразовывал любые вкладки, которые были в исходном документе, в эквивалент их символьного объекта (	). Я пробовал оба:

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

и

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

но ни одна из них не помогает. У кого-нибудь есть предложения? Потому что:

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

выглядит действительно глупо (даже если это работает).

Ответы [ 4 ]

2 голосов
/ 01 июля 2009

Так что ответ на этот вопрос оказался довольно отстойным: обновите Xalan. Я не знаю, что случилось с моей старой версией, но когда я переключился на последнюю версию по адресу: http://xml.apache.org/xalan-j/downloads.html внезапно исчезнувшие из вкладок сущности просто ушли. Спасибо всем за помощь.

1 голос
/ 30 июня 2009

Вы можете попробовать использовать SAXTransformerFactory в сочетании с XMLReader.

Что-то вроде:

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());

Вы должны иметь возможность настроить синтаксический анализатор SAX так, чтобы он не включал игнорируемые пробелы, если он по умолчанию еще этого не делает. Я на самом деле не проверял это, но я делаю нечто подобное в одном из моих проектов.

0 голосов
/ 30 июня 2009

Есть ли причина, по которой вы сначала читаете файл в строку, а не напрямую используете поток файлов?

Вместо

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

Вы можете попробовать

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

Возможно, это не является причиной проблемы, но я видел, что раньше это вызывало похожие проблемы. Если ваш FileUtils.readFileToString - версия Commons.IO, он читает строку как UFT-16 (по умолчанию Java, IIRC) вместо того, что вы хотите, то есть UTF-8.

0 голосов
/ 29 июня 2009

Иногда с такими вещами замена их потом регулярным выражением - это не совсем плохой вариант, который, по крайней мере, заставляет вас двигаться дальше, пока вы не найдете лучший вариант позже.

...