你如何防止变压器的javax逃逸空白?(How Do You Prevent A javax Tra

2019-09-17 05:28发布

我使用的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>

看起来真的很愚蠢的(即使它的工作)。

Answer 1:

所以,这个问题的答案一个竟然是相当跛脚:更新的Xalan。 我不知道什么是错的我的老版本,但是当我在切换到最新版本: http://xml.apache.org/xalan-j/downloads.html突然标签的实体转义只是走了。 谢谢大家对你的帮助,虽然。



Answer 2:

你可以尝试使用相结合的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解析器不包括忽略的空格,如果它不已经在默认情况下做到这一点。 我还没有实际测试过这一点,但我在我的项目的一个类似的东西。



Answer 3:

有时事情就是这样,自己与正则表达式替换它们之后是不是一个完全坏的选择,这至少可以让你走,直到你后来发现一个更好的选择。



Answer 4:

有没有你正在阅读的文件转换成字符串第一,而不是直接使用文件流的原因吗?

代替

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。



文章来源: How Do You Prevent A javax Transformer From Escaping Whitespace?