我使用以下代码来打印XML字符串:
private String prettyFormat(String xml) throws TransformerException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException {
String formattedString = null;
try {
final InputSource src = new InputSource(new StringReader(xml));
final Node document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(src).getDocumentElement();
System.setProperty(DOMImplementationRegistry.PROPERTY,"com.sun.org.apache.xerces.internal.dom.DOMImplementationSourceImpl");
final DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
final DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
final LSSerializer writer = impl.createLSSerializer();
writer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);
writer.getDomConfig().setParameter("xml-declaration", Boolean.FALSE);
formattedString = writer.writeToString(document);
} catch (Exception e) {
throw new RuntimeException(e);
}
return formattedString;
}
我遇到的问题是它包裹了长行以便:
<message code="272" coeMsgName="CCR_I-Credit-Control-Initial" endtoend="AUTO" error="false" hopbyhop="AUTO" proxiable="true" request="true" retransmit="false">
成为这个:
<message code="272" coeMsgName="CCR_I-Credit-Control-Initial"
endtoend="AUTO" error="false" hopbyhop="AUTO" proxiable="true"
request="true" retransmit="false">
答案 0 :(得分:1)
你不能。至少在使用LSSerializer时没有,因为它使用的XMLSerializer是私有的,而LSSerializer(及其实现DOMSerializerImpl)没有任何设置OutputFormat属性的方法。但是,您可以直接使用XMLSerializer:
private static String prettyFormat(String xml) throws TransformerException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException {
String formattedString = null;
try {
final InputSource src = new InputSource(new StringReader(xml));
final Node document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(src).getDocumentElement();
// the last parameter sets indenting/pretty-printing to true:
OutputFormat outputFormat = new OutputFormat("WHATEVER", "UTF-8", true);
// line width = 0 means no line wrapping:
outputFormat.setLineWidth(0);
StringWriter sw = new StringWriter();
XML11Serializer writer = new XML11Serializer(sw, outputFormat);
writer.serialize((Element)document);
formattedString = sw.toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
return formattedString;
}
结果:
<message code="272" coeMsgName="CCR_I-Credit-Control-Initial" endtoend="AUTO" error="false" hopbyhop="AUTO" proxiable="true" request="true" retransmit="false">
<test/>
</message>
答案 1 :(得分:1)
我通过 javax.xml.transform.Transformer
public static String formatXml(Document doc) {
try {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
StreamResult result = new StreamResult(new StringWriter());
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
return result.getWriter().toString();
} catch (ClassCastException | TransformerException | TransformerFactoryConfigurationError e) {
throw new IllegalArgumentException("Cannot format xml", e);
}
}