你如何防止javax变换器逃离空白?

时间:2009-06-29 18:51:12

标签: java entity escaping transformer xslt

我正在使用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 个答案:

答案 0 :(得分:2)

所以这个问题的答案结果非常蹩脚:更新Xalan。我不知道我的旧版本有什么问题,但当我切换到最新版本时:   http://xml.apache.org/xalan-j/downloads.html 突然,实体逃脱的标签就消失了。感谢大家的帮助。

答案 1 :(得分:1)

您可以尝试将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解析器设置为不包含可忽略的空格。我实际上没有对此进行测试,但我在其中一个项目中做了类似的事情。

答案 2 :(得分:0)

有时使用这样的东西,之后用正则表达式替换它们并不是一个完全糟糕的选择,这至少会让你继续前进,直到你以后找到更好的选择。

答案 3 :(得分:0)

是否有任何理由首先将文件读入字符串而不是直接使用文件流?

而不是

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。