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:

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

parece realmente estúpido (mesmo que ela não funciona).

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top