В этой теме есть дюжина потоков, но все они содержат ответы, которые не работают для меня удовлетворительным образом. Кажется, нужно использовать конкретную реализацию DOM. Тем не менее, я не могу заставить его читать входные данные XML:Довольно печатать XML с использованием Java
@Test
public void testPrettyPrintConvertDomLevel3() throws UnsupportedEncodingException {
String unformattedXml
= "<?xml version=\"1.0\" encoding=\"UTF-16\"?><QueryMessage\n"
+ " xmlns=\"http://www.SDMX.org/resources/SDMXML/schemas/v2_0/message\"\n"
+ " xmlns:query=\"http://www.SDMX.org/resources/SDMXML/schemas/v2_0/query\">\n"
+ " <Query>\n"
+ " <query:CategorySchemeWhere>\n"
+ " \t\t\t\t\t <query:AgencyID>ECB\n\n\n\n</query:AgencyID>\n"
+ " </query:CategorySchemeWhere>\n"
+ " </Query>\n\n\n\n\n"
+ "</QueryMessage>";
System.out.println(prettyPrintWithXercesDomLevel3(unformattedXml.getBytes("UTF-16")));
}
Вот метод:
public static String prettyPrintWithXercesDomLevel3(byte[] input) {
try {
//System.setProperty(DOMImplementationRegistry.PROPERTY,"org.apache.xerces.dom.DOMImplementationSourceImpl");
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("XML 3.0 LS 3.0");
if (impl == null) {
throw new RuntimeException("No DOMImplementation found !");
}
log.info(String.format("DOMImplementationLS: %s", impl.getClass().getName()));
LSParser parser = impl.createLSParser(
DOMImplementationLS.MODE_SYNCHRONOUS,
//"http://www.w3.org/2001/XMLSchema");
"http://www.w3.org/TR/REC-xml");
log.info(String.format("LSParser: %s", parser.getClass().getName()));
LSInput lsi = impl.createLSInput();
lsi.setByteStream(new ByteArrayInputStream(input));
Document doc = parser.parse(lsi);
LSSerializer serializer = impl.createLSSerializer();
serializer.getDomConfig().setParameter("format-pretty-print",Boolean.TRUE);
LSOutput output = impl.createLSOutput();
output.setEncoding("UTF-8");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
output.setByteStream(baos);
serializer.write(doc, output);
return baos.toString();
// return serializer.writeToString(doc);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Однако довольно-печать не работает. Есть идеи?
попробуйте изменить 'xml.getBytes()' в 'xml.getBytes ("UTF-8")' –
Как примечание стороны, я бы рассмотреть возможность использования [StringBuilder] (https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html) – victorantunes
в качестве примечания, это только пример. и строка находится в ASCII. Если вы не знаете о внутренности XML Java, пропустите эту тему. – user1050755