Trên thực tế, Java hỗ trợ 4 phương thức để phân tích XML ra khỏi hộp:
DOM Parser / Builder: Toàn bộ cấu trúc XML được tải vào bộ nhớ và bạn có thể sử dụng các phương thức DOM nổi tiếng để làm việc với nó. DOM cũng cho phép bạn ghi vào tài liệu với các phép biến đổi Xslt. Thí dụ:
public static void parse() throws ParserConfigurationException, IOException, SAXException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder = factory.newDocumentBuilder();
File file = new File("test.xml");
Document doc = builder.parse(file);
// Do something with the document here.
}
SAX Parser: Hoàn toàn để đọc tài liệu XML. Trình phân tích cú pháp Sax chạy qua tài liệu và gọi các phương thức gọi lại của người dùng. Có các phương thức để bắt đầu / kết thúc một tài liệu, phần tử, v.v. Chúng được định nghĩa trong org.xml.sax.ContentHandler và có một lớp trình trợ giúp trống DefaultHandler.
public static void parse() throws ParserConfigurationException, SAXException {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
SAXParser saxParser = factory.newSAXParser();
File file = new File("test.xml");
saxParser.parse(file, new ElementHandler()); // specify handler
}
StAx Reader / Writer: Điều này hoạt động với giao diện hướng dữ liệu. Chương trình yêu cầu phần tử tiếp theo khi nó sẵn sàng giống như một con trỏ / iterator. Bạn cũng có thể tạo tài liệu với nó. Đọc tài liệu:
public static void parse() throws XMLStreamException, IOException {
try (FileInputStream fis = new FileInputStream("test.xml")) {
XMLInputFactory xmlInFact = XMLInputFactory.newInstance();
XMLStreamReader reader = xmlInFact.createXMLStreamReader(fis);
while(reader.hasNext()) {
reader.next(); // do something here
}
}
}
Viết tài liệu:
public static void parse() throws XMLStreamException, IOException {
try (FileOutputStream fos = new FileOutputStream("test.xml")){
XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
XMLStreamWriter writer = xmlOutFact.createXMLStreamWriter(fos);
writer.writeStartDocument();
writer.writeStartElement("test");
// write stuff
writer.writeEndElement();
}
}
JAXB: Việc triển khai mới nhất để đọc các tài liệu XML: Là một phần của Java 6 trong v2. Điều này cho phép chúng ta tuần tự hóa các đối tượng java từ một tài liệu. Bạn đọc tài liệu với một lớp thực hiện giao diện cho javax.xml.bind.Unmarshaller (bạn nhận được một lớp cho điều này từ JAXBContext.newInstance). Bối cảnh phải được khởi tạo với các lớp được sử dụng, nhưng bạn chỉ cần xác định các lớp gốc và không phải lo lắng về các lớp được tham chiếu tĩnh. Bạn sử dụng các chú thích để chỉ định các lớp nào sẽ là các phần tử (@XmlRootEuity) và các trường nào là các phần tử (@XmlEuity) hoặc các thuộc tính (@XmlAttribution, thật bất ngờ!)
public static void parse() throws JAXBException, IOException {
try (FileInputStream adrFile = new FileInputStream("test")) {
JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
Unmarshaller um = ctx.createUnmarshaller();
RootElementClass rootElement = (RootElementClass) um.unmarshal(adrFile);
}
}
Viết tài liệu:
public static void parse(RootElementClass out) throws IOException, JAXBException {
try (FileOutputStream adrFile = new FileOutputStream("test.xml")) {
JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
Marshaller ma = ctx.createMarshaller();
ma.marshal(out, adrFile);
}
}
Các ví dụ được sao chép một cách đáng xấu hổ từ một số slide bài giảng cũ ;-)
Chỉnh sửa: Giới thiệu "Tôi nên sử dụng API nào?". Chà nó phụ thuộc - không phải tất cả các API đều có các khả năng như bạn thấy, nhưng nếu bạn có quyền kiểm soát các lớp bạn sử dụng để ánh xạ tài liệu XML thì JAXB là giải pháp đơn giản, thực sự thanh lịch và đơn giản của tôi (mặc dù tôi chưa sử dụng nó cho tài liệu thực sự lớn, nó có thể có một chút phức tạp). SAX cũng khá dễ sử dụng và chỉ cần tránh xa DOM nếu bạn không có lý do thực sự tốt để sử dụng nó - theo quan điểm của tôi, API cũ kỹ, cồng kềnh. Tôi không nghĩ rằng có bất kỳ thư viện bên thứ 3 hiện đại nào có tính năng đặc biệt hữu ích mà STL thiếu và các thư viện tiêu chuẩn có những ưu điểm thông thường là được kiểm tra, ghi chép và ổn định cực kỳ tốt.