我需要在 Dom 文档对象中设置 XmlEncoding (UTF-8),而不使用带有他的“setOutputProperty(OutputKeys.ENCODING,”UTF-8”) 方法的 Transformer。
我不想使用 Transform 对象获取 XML 字符串,因为我正在使用 Xades XMLSignature 库,该库使用 Document 对象进行签名。
问题是对于如下创建的 Dom 文档,他的 getXmlEncoding() 方法返回 null。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
document.getXmlEncoding(); //Returns null
但应用以下代码后,新 DOM 文档的 XmlEncoding 方法返回 UTF-8(我的 xades 库的要求)。这是因为转换过程以某种方式添加了编码。出于性能原因,我想避免执行此代码。
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
DOMSource source = new DOMSource(document);
Writer writer = new StringWriter();
StreamResult result = new StreamResult(writer);
transformer.transform(source, result);
String xml = writer.toString();
InputStream stream = new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8));
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document newDocument = dbf.newDocumentBuilder().parse(inputStream);
newDocument.getXmlEncoding(); //returns "UTF-8"
如何使用序言信息创建 Dom 文档?