Sử dụng mã đơn giản sau đây:Khá-in đầu ra từ javax.xml.transform.Transformer với api chỉ tiêu chuẩn java (Indentation và định vị DOCTYPE)
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());
}
}
tôi nhận được kết quả:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Document comment --><!DOCTYPE aaa SYSTEM "testing.dtd">
<aaa>
<bbb/>
<ccc/>
</aaa>
Câu hỏi A: Thẻ doctype xuất hiện sau khi nhận xét tài liệu. Có thể làm cho nó xuất hiện trước khi nhận xét tài liệu?
Câu hỏi B: Làm cách nào để đạt được thụt đầu dòng, chỉ sử dụng API JavaSE 5.0? Câu hỏi này về cơ bản giống hệt với How to pretty-print xml from java, tuy nhiên hầu như tất cả các câu trả lời trong câu hỏi đó đều phụ thuộc vào thư viện bên ngoài. Câu trả lời áp dụng duy nhất (được đăng bởi một người dùng tên Lorenzo Boccaccia) chỉ sử dụng api của java, về cơ bản là bằng mã được đăng ở trên, nhưng không hoạt động đối với tôi (như được hiển thị trong đầu ra, tôi không nhận được thụt đầu dòng).
Tôi đoán rằng bạn phải đặt số lượng khoảng trống để sử dụng cho thụt lề, vì nhiều câu trả lời có thư viện bên ngoài, nhưng tôi không thể tìm thấy nơi để chỉ định trong java api. Với thực tế là khả năng để thiết lập một tài sản thụt đầu dòng để "có" tồn tại trong api java, nó phải có thể thực hiện thụt đầu dòng bằng cách nào đó. Tôi không thể hiểu được làm thế nào.
Câu hỏi A không có ý nghĩa. Bạn có nghĩa là "trước" trong phần thứ hai? –
Có. Tôi đã chỉnh sửa câu hỏi để thay đổi lỗi đánh máy. Cảm ơn bạn. – Alderath
Lặp lại nhận xét tôi đã tạo trong http://stackoverflow.com/questions/139076/how-to-pretty-print-xml-from-java - bây giờ bạn có thể in đẹp mà không cần thư viện bên ngoài. Xem http://xerces.apache.org/xerces2-j/faq-general.html#faq-6. Có đây là một câu hỏi thường gặp của Xerces nhưng câu trả lời bao gồm các lớp JDK tiêu chuẩn. Việc triển khai 1.5 ban đầu của các lớp này có nhiều vấn đề nhưng mọi thứ hoạt động tốt từ 1.6 trở lên. Sao chép ví dụ LSSerializer trong FAQ, cắt bit "..." và thêm 'writer.getDomConfig(). SetParameter (" format-pretty-print ", Boolean.TRUE);' sau khi 'LSSerializer writer = ... 'dòng. –