2016-02-26 11 views
0

Мне нужно установить XmlEncoding (UTF-8) в объект Dom Document без использования Transformer с его методом setOutputProperty (OutputKeys.ENCODING, "UTF-8").Установить XmlEncoding для документа Dom в Java

Я не хочу получать XML-строку, используя объект Transform, потому что я использую библиотеку 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 

Но после того, как применить следующий код, то XmlEncoding methoth нового документа DOM возвращает UTF-8 (requeriment для моей библиотеки 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 с информацией о прологе?

ответ

0

Вы можете использовать Apache Axiom's DOM implementation. Он реализует как API DOM, так и собственный API Axiom, что фактически позволяет установить кодировку XML. Просто добавьте axiom-dom в свой проект и использовать следующую команду, чтобы получить DocumentBuilderFactory:

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

Вы можете установить кодировку XML на документ следующим образом:

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

Остальная часть кода остается неизменным и может продолжать использовать DOM API.