0

我需要在 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 文档?

4

1 回答 1

0

您可以尝试使用Apache Axiom 的 DOM implementation。它实现了 DOM API 和 Axiom 自己的 API,实际上允许设置 XML 编码。只需添加axiom-dom到您的项目并使用以下说明获取DocumentBuilderFactory

DocumentBuilderFactory factory = ((DOMMetaFactory)OMAbstractFactory.getMetaFactory(OMAbstractFactory.FEATURE_DOM)).newDocumentBuilderFactory();

然后,您可以在文档上设置 XML 编码,如下所示:

((OMDocument)document).setXMLEncoding("utf-8");

其余代码保持不变,可以继续使用 DOM API。

于 2016-03-01T07:56:08.187 回答