Используя следующий простой код:
package test;
import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
public class TestOutputKeys {
public static void main(String[] args) throws TransformerException {
// Instantiate transformer input
Source xmlInput = new StreamSource(new StringReader(
"<!-- Document comment --><aaa><bbb/><ccc/></aaa>"));
StreamResult xmlOutput = new StreamResult(new StringWriter());
// Configure transformer
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(); // An identity transformer
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "testing.dtd");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(xmlInput, xmlOutput);
System.out.println(xmlOutput.getWriter().toString());
}
}
Я получаю вывод:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Document comment --><!DOCTYPE aaa SYSTEM "testing.dtd">
<aaa>
<bbb/>
<ccc/>
</aaa>
Вопрос A: Тег doctype появляется после комментария документа. Возможно ли сделать это перед комментарием документа?
Вопрос B: Как достичь отступов, используя только API JavaSE 5.0? Этот вопрос по существу идентичен Как красиво печатать xml из java, однако почти все ответы в этом вопросе зависят от внешних библиотек. Единственный применимый ответ (отправленный пользователем по имени Lorenzo Boccaccia), который использует только java api, в основном равен приведенному выше коду, но не работает для меня (как показано на выходе, я не получаю отступов).
Я предполагаю, что вам нужно задать количество пробелов для отступов, так как многие ответы с внешними библиотеками, но я просто не могу найти, где указать это в java api. Учитывая тот факт, что в java-api существует возможность установить свойство "отступы", должно быть возможно каким-то образом выполнить отступ. Я просто не могу понять, как.