Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止javax转换器转义空白?_Java_Entity_Escaping_Transformer_Xslt - Fatal编程技术网

如何防止javax转换器转义空白?

如何防止javax转换器转义空白?,java,entity,escaping,transformer,xslt,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 extra

我使用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");
以及:

但这两个都没有帮助。有人有什么建议吗?因为:

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

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

有时候像这样的事情,事后用regex替换它们并不是一个完全坏的选择,至少在以后找到更好的选择之前,这会让你继续努力。

你可以尝试将SAXSTransformerFactory与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解析器在默认情况下还没有包含可忽略的空格,那么应该能够将其设置为不包含可忽略的空格。实际上我还没有测试过这个,但我在我的一个项目中做了类似的事情。

有什么原因让你先将文件读入字符串,而不是直接使用文件流

而不是

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。

因此,对这个问题的答案是非常蹩脚的:更新Xalan。我不知道我的旧版本有什么问题,但当我在以下位置切换到最新版本时:
突然,标签的实体消失了。谢谢大家的帮助。

谢谢你的建议。如果我真的找不到更好的东西,我会用它,但是我想避免乱码的愿望(还有我的骄傲;我的同事可能有一天会看到这段代码;-)会阻止我用它。谢谢你的建议,但是(正如我对Christopher Morley所说的)后处理额外处理层真的是乱码;我真正想要的是告诉Transformer不要将tabs转换为 ;首先是实体引用。虽然我这样做了,但在本例中,字符引用和实际Unicode字符之间对于XML(然后是XSLT)没有语义差异。这也是关于Xalan的具体情况(正如您自己的答案所指出的)。因此,这个答案的正确标记是
xsltprocessor
transformer.transform(new StreamSource(new FileReader(sampleXmlPath)),
    new StreamResult(extractionWriter));