Como você impede Um javax Transformador de escapar espaços em branco?
-
21-08-2019 - |
Pergunta
Eu estou usando a classe javax.xml.transform.Transformer para executar algumas traduções XSLT, assim:
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());
No entanto, não importa o que eu faço eu não consigo evitar que o convertido transformador de quaisquer separadores que se encontravam no documento de origem para o seu equivalente entidade de caractere (	
). Eu tentei tanto:
transformer.setParameter("encoding", "UTF-8");
e
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
mas nenhum deles ajuda. Alguém tem alguma sugestão? Porque:
					<MyElement>
parece realmente estúpido (mesmo que ela não funciona).
Solução
Portanto, a resposta a esta acabou por ser muito manco: update Xalan. Eu não sei o que estava errado com a minha versão antiga, mas quando eu mudei para a versão mais recente em: http://xml.apache.org/xalan-j/downloads.html de repente, a entidade de escapar de guias apenas foi embora. Obrigado a todos por sua ajuda embora.
Outras dicas
Você pode tentar usar um SAXTransformerFactory em combinação com um XMLReader.
Algo como:
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());
Você deve ser capaz de definir o analisador SAX para não incluir espaços em branco ignorable, se ele já não fazê-lo por padrão. Eu realmente não tenho testado isso, mas eu fazer algo semelhante em um dos meus projetos.
Às vezes com coisas como esta, substituindo-se com regex depois não é uma opção totalmente ruim, o que, pelo menos você fica indo até encontrar uma opção melhor mais tarde.
Existe alguma razão que você está lendo o arquivo em uma string primeira vez de usar um fluxo de arquivo diretamente?
Em vez de
String xml = FileUtils.readFileToString(new File(sampleXmlPath));
transformer.transform(new StreamSource(new StringReader(xml)),
new StreamResult(extractionWriter));
Você poderia tentar
transformer.transform(new StreamSource(new FileReader(sampleXmlPath)),
new StreamResult(extractionWriter));
Isto não pode ser a causa do problema, mas eu já vi isso causa problemas semelhantes antes. Se o seu FileUtils.readFileToString é a versão Commons.IO, está lendo a corda no como UFT-16 (o padrão Java, IIRC) em vez do que você quer, que é UTF-8.