Cách dễ nhất để in đẹp (a.k.a. được định dạng) là một số org.w3c.dom.Document
thành stdout là gì?Cách ngắn nhất để in đẹp một org.w3c.dom.Document thành stdout là gì?
Trả lời
Gọi printDocument(doc, System.out)
, nơi phương pháp mà trông như thế này:
public static void printDocument(Document doc, OutputStream out) throws IOException, TransformerException {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.transform(new DOMSource(doc),
new StreamResult(new OutputStreamWriter(out, "UTF-8")));
}
(Các indent-amount
là tùy chọn và có thể không hoạt động với cấu hình cụ thể của bạn)
Làm thế nào về:
OutputFormat format = new OutputFormat(doc);
format.setIndenting(true);
XMLSerializer serializer = new XMLSerializer(System.out, format);
serializer.serialize(doc);
Trong khi dễ dàng hơn, cách tiếp cận này yêu cầu Xerces – Pace
private void printNode(Node rootNode, String spacer) {
System.out.println(spacer + rootNode.getNodeName() + " -> " + rootNode.getNodeValue());
NodeList nl = rootNode.getChildNodes();
for (int i = 0; i < nl.getLength(); i++)
printNode(nl.item(i), spacer + " ");
}
Tôi đánh giá cao rằng Q yêu cầu ngắn nhất, nhưng (vì lợi ích của bất kỳ ai khác) có lẽ bạn có thể giải thích câu trả lời của mình giải thích những gì đang xảy ra? – Andrew
Hãy thử jcabi-xml với một lớp lót:
String xml = new XMLDocument(document).toString();
Đây là sự phụ thuộc bạn cần:
<dependency>
<groupId>com.jcabi</groupId>
<artifactId>jcabi-xml</artifactId>
<version>0.14</version>
</dependency>
này sẽ trả về một đầu ra độc đáo formated bằng cách sử dụng đệ quy gốc/đi lên.
private static boolean skipNL;
private static String printXML(Node rootNode) {
String tab = "";
skipNL = false;
return(printXML(rootNode, tab));
}
private static String printXML(Node rootNode, String tab) {
String print = "";
if(rootNode.getNodeType()==Node.ELEMENT_NODE) {
print += "\n"+tab+"<"+rootNode.getNodeName()+">";
}
NodeList nl = rootNode.getChildNodes();
if(nl.getLength()>0) {
for (int i = 0; i < nl.getLength(); i++) {
print += printXML(nl.item(i), tab+" "); // \t
}
} else {
if(rootNode.getNodeValue()!=null) {
print = rootNode.getNodeValue();
}
skipNL = true;
}
if(rootNode.getNodeType()==Node.ELEMENT_NODE) {
if(!skipNL) {
print += "\n"+tab;
}
skipNL = false;
print += "</"+rootNode.getNodeName()+">";
}
return(print);
}
Điều này rất không đầy đủ. – Andrew
nếu bạn sử dụng dom4j, nó sẽ là dom4JDOM.asString()
Không phải là nó mỉa mai rằng đó là "dễ nhất" cách chỉ đơn giản là in một tài liệu XML trong Java? – Thomas
mặt khác, bạn có nhiều quyền kiểm soát;) – Bozho
Brilliant! Và có, nó là một chút văn bản nhưng nó là tinh thể rõ ràng những gì các tùy chọn được lựa chọn và Eclipse/Netbeans thực sự giúp bạn viết này. Chỉ cho tôi một phiên bản nhỏ hơn và tôi cho bạn biết những gì nó không thể làm được. Tồi tệ hơn, tôi sẽ nói cho bạn biết bạn cần 3 vòng gỡ lỗi để làm đúng ... –