转换器未从文档对象读取特殊字符



我正在尝试从文档对象读取xml数据,然后使用转换器将文档对象内部的数据呈现为pdf,使用XSL、

我的代码是:

Document doc = toXML(arg1,arg2);

文档包含以下数据:带有标签的Ilkyönetmeliği

InputStream inputStream = new FileInputStream(xslFilePath);
transformer = factory.newTransformer(new StreamSource(inputStream));
transformer.setParameter("encoding", "UTF-8");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(new DOMSource(doc.getDocumentElement()), res);

xml中存在的特殊字符不会得到相应的渲染,也不会像一样显示

#lk码#m

我还将编码设置为UTF-8,但它仍然像上面一样显示。

目前尚不清楚是什么原因导致了您的编码问题,因为我看不到您的文档是如何读取/构造的,也看不到转换结果res是如何设置的。请尝试以下使用XSLT处理编码的独立示例代码。也许你甚至可以逐渐修改它,使用你的实际数据,看看哪里出了问题。

public static void main(String[] args) {
try {
String inputEncoding = "UTF-16";
String xsltEncoding = "ASCII";
String outputEncoding = "UTF-8";
ByteArrayOutputStream bos = new ByteArrayOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(bos, inputEncoding);
osw.write("<?xml version='1.0' encoding='" + inputEncoding + "'?>");
osw.write("<root>İlkyönetmeliği</root>"); osw.close();
byte[] inputBytes = bos.toByteArray();
bos.reset();
osw = new OutputStreamWriter(bos, xsltEncoding);
osw.write("<?xml version='1.0' encoding='" + xsltEncoding + "'?>");
osw.write("<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>");
osw.write("<xsl:template match='@*|node()'><xsl:copy><xsl:apply-templates select='@*|node()'/></xsl:copy></xsl:template>");
osw.write("</xsl:stylesheet>"); osw.close();
byte[] xsltBytes = bos.toByteArray();
bos.reset();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document d = db.parse(new InputSource(new InputStreamReader(new ByteArrayInputStream(inputBytes), inputEncoding)));
// if encoding declaration correct, use: Document d = db.parse(new InputSource(new ByteArrayInputStream(inputBytes)));
System.out.println(XPathFactory.newInstance().newXPath().evaluate("/root[1]", d));
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer(new StreamSource(new InputStreamReader(new ByteArrayInputStream(xsltBytes), xsltEncoding)));
// if encoding declaration correct, use: Transformer t = tf.newTransformer(new StreamSource(new ByteArrayInputStream(xsltBytes)));
StreamResult sr = new StreamResult(new OutputStreamWriter(bos, outputEncoding));
t.setOutputProperty(OutputKeys.ENCODING, outputEncoding);
t.transform(new DOMSource(d.getDocumentElement()), sr);
byte[] outputBytes = bos.toByteArray();
Scanner s = new Scanner(new InputStreamReader(new ByteArrayInputStream(outputBytes), outputEncoding));
String output = s.useDelimiter("</>").next(); // read all
s.close();
System.out.println(output);
} catch (Exception ex) {
ex.printStackTrace(System.err);
}

示例代码将XSLT标识模板应用于包含非ASCII字符的最小输入。

我输出字符串以检查它是否在文档中使用XPath正确解析。如果您知道如何使用XPath定位(中间)文档,则可能需要检查它。

请注意,如果存在,解析器在读取XML文件时会默认尝试采用XML处理指令(PI)中声明的编码。它假设实际编码和声明编码是相同的。如果它们不同或PI丢失,则可以强制执行实际编码,例如,如上面的代码中所示,使用InputStreamReader

最新更新