2

我正在使用 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

4 回答 4

2

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

于 2009-06-30T22:18:42.330 回答
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 解析器设置为不包含可忽略的空格,如果它在默认情况下还没有这样做的话。我实际上没有对此进行测试,但我在我的一个项目中做了类似的事情。

于 2009-06-30T06:52:51.880 回答
0

有时像这样的事情,事后自己用正则表达式替换它们并不是一个完全错误的选择,这至少可以让你继续前进,直到你以后找到更好的选择。

于 2009-06-29T19:02:41.967 回答
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。

于 2009-06-30T18:18:50.070 回答