【问题标题】:Set XmlEncoding to Dom Document in Java在 Java 中将 XmlEncoding 设置为 Dom 文档
【发布时间】:2016-06-09 14:30:31
【问题描述】:

我需要在 Dom 文档对象中设置 XmlEncoding (UTF-8),而不使用带有他的“setOutputProperty(OutputKeys.ENCODING,”UTF-8”) 方法的 Transformer。

我不想使用 Transform 对象获取 XML 字符串,因为我使用的是 Xades XMLSignature 库,该库使用 Document 对象进行签名。

问题是如下创建的Dom Document,他的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 文档?

【问题讨论】:

    标签: dom domdocument xml-encoding


    【解决方案1】:

    您可以尝试使用Apache Axiom's 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。

    【讨论】:

      猜你喜欢
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      相关资源
      最近更新 更多