Đó là thư viện tốt nhất để phân tích cú pháp XML trong java [đã đóng]


158

Tôi đang tìm kiếm thư viện java để phân tích cú pháp XML (tệp cấu hình và dữ liệu phức tạp), tôi đã tìm hiểu một chút nhưng không thể tìm thấy ngoài dom4j (Có vẻ như họ đang làm việc trên V2) .. Tôi đã xem xét cấu hình commons nhưng không Không thích nó, các dự án apache khác trên XML dường như đang ngủ đông. Tôi chưa tự mình đánh giá dom4j nhưng chỉ muốn biết - java có các thư viện phân tích xml mã nguồn mở (Tốt) khác không? và trải nghiệm của bạn với dom4j như thế nào?

Sau câu trả lời của @ Voo, hãy hỏi tôi một câu hỏi khác - Tôi có nên sử dụng các lớp dựng sẵn của java hoặc bất kỳ thư viện bên thứ ba nào như dom4j .. Những lợi thế là gì?


Bạn có thể định nghĩa tốt? Hiệu suất, chất lượng của API, còn gì nữa không?
Yishai

Hiệu suất và dễ sử dụng (có, Chất lượng API)
Premraj

3
Bạn đã không đăng bất kỳ lý do cụ thể nào cho việc không sử dụng các triển khai gốc của Java.
Hovercraft Full Of Eels

vtd-xml sẽ là người đánh bại để sử dụng hiệu năng / bộ nhớ và dễ sử dụng.
vtd-xml-tác giả

Câu trả lời:


213

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.


@Natix đó là lý do tại sao tùy chọn "chỉnh sửa" là dành cho. Nên tốt hơn bây giờ.
Kikiwa

4
@Kikiwa Xử lý ngoại lệ là loại bỏ càng nhiều từ điểm của bài đăng này càng tốt. Nếu một số lập trình viên sao chép không đủ năng lực đi trước và sao chép đoạn trích mà không hiểu mục đích của họ, họ sẽ nhận được những gì họ xứng đáng. Không thực sự lo lắng hoặc quan tâm đến họ. Điều tôi sẽ nói là việc loại bỏ các khối thử / bắt và hiển thị chữ ký phương thức thay vào đó để ghi lại những ngoại lệ mà các tùy chọn khác nhau có thể ném sẽ tiết kiệm không gian trong khi vẫn giữ được thông tin thú vị. Vì vậy, nếu ai đó muốn làm điều đó, họ nên đi trước.
Voo

1
(Đồng thời tôi sẽ từ chối các chỉnh sửa loại bỏ thử / bắt mà không biểu thị thông tin bổ sung theo một cách khác)
Voo

Tôi tin rằng JAXB không còn được bao gồm với JDK trong các phiên bản gần đây.
Slaw 17/03/19

11

Java hỗ trợ hai phương pháp để phân tích cú pháp XML ra khỏi hộp.

SAXParser

Bạn có thể sử dụng trình phân tích cú pháp này nếu bạn muốn phân tích các tệp XML lớn và / hoặc không muốn sử dụng nhiều bộ nhớ.

http://doad.oracle.com/javase/6/docs/api/javax/xml/parsers/SAXParserFactory.html

Ví dụ: http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

DOMParser

Bạn có thể sử dụng trình phân tích cú pháp này nếu bạn cần thực hiện các truy vấn XPath hoặc cần có sẵn DOM hoàn chỉnh.

http://doad.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilderFactory.html

Ví dụ: http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/


5

Nếu bạn muốn có một API giống như DOM - nghĩa là, một trình phân tích cú pháp XML biến tài liệu thành một cây các nút Phần tử và Thuộc tính - thì có ít nhất bốn lựa chọn: DOM, JDOM, DOM4J và XOM. Lý do duy nhất có thể để sử dụng DOM là vì nó được coi là một tiêu chuẩn và được cung cấp trong JDK: trong tất cả các khía cạnh khác, các khía cạnh khác đều vượt trội. Sở thích của riêng tôi, vì sự kết hợp của sự đơn giản, sức mạnh và hiệu suất, là XOM.

Và tất nhiên, có các kiểu xử lý khác: giao diện trình phân tích cú pháp mức thấp (SAX và StAX), giao diện liên kết đối tượng dữ liệu (JAXB) và ngôn ngữ khai báo cấp cao (XSLT, XQuery, XPath). Điều gì là tốt nhất cho bạn phụ thuộc vào yêu cầu dự án và sở thích cá nhân của bạn.


2
DOM là tiêu chuẩn W3C ( w3.org/DOM ). Việc triển khai Java của tiêu chuẩn này được bao phủ bởi tiêu chuẩn JAXP ( jcp.org/en/jsr/detail?id=206 ). JAXP sau đó được triển khai bởi các nhà cung cấp khác nhau như: Oracle, Apache, v.v.
bdoughan

Thật vậy, không ai sẽ sử dụng DOM cả nếu không (a) nó được định nghĩa là một tiêu chuẩn và có nhiều triển khai, và (b) nó được bao gồm trong JDK theo mặc định. Từ tất cả các quan điểm khác, JDOM2 và XOM được ưa thích hơn nhiều.
Michael Kay

4

Quan điểm của Nikita là một điểm tuyệt vời: đừng nhầm lẫn giữa trưởng thành với xấu. XML đã không thay đổi nhiều.

JDOM sẽ là một lựa chọn khác cho DOM4J.


Bạn sẽ chọn cái nào và tại sao?
Premraj

1
Nó không thực sự quan trọng. Cả hai đều là các trình bao bọc của các trình phân tích cú pháp SAX và DOM được tích hợp trong JDK. Hệ thống phân cấp Tài liệu W3C dài dòng và khó sử dụng, vì vậy cả DOM4J và JDOM đều cố gắng làm cho nó dễ dàng hơn. Tôi thích Elliott Rusty Harold, vì vậy tôi có xu hướng tiếp cận với JDOM trước tiên.
duffymo

4

Bạn không cần một thư viện bên ngoài để phân tích cú pháp XML trong Java. Java đã đi kèm với các triển khai tích hợp cho SAX và DOM từ lâu.


3

Đối với những người quan tâm đến việc sử dụng JDOM, nhưng e rằng đã không được cập nhật trong một thời gian (đặc biệt là không tận dụng các tổng quát Java), có một ngã ba có tên CoffeeDOM giải quyết chính xác các khía cạnh này và hiện đại hóa API JDOM, đọc thêm tại đây:

http://cdmckay.org/blog/2011/05/20/int sinh-coffeedom-a-jdom-fork-for-java-5 /

và tải nó từ trang dự án tại:

https://github.com/cdmckay/coffeedom


1

VTD-XML là lib phân tích cú pháp XML nặng nề ... nó tốt hơn các cách khác về mọi mặt ... đây là một bài viết năm 2013 phân tích tất cả các khung xử lý XML có sẵn trong nền tảng java ...

http://sdiwc.us/digitlib/journal_apers.php?apers=00000582.pdf


3
Một cảnh báo: VTD-XML, nó được cấp phép theo GPL, có hiệu quả loại trừ nó trong phần lớn các tình huống phát triển thương mại hoặc chuyên nghiệp. Các kỹ sư nên tham khảo luật sư riêng của họ để phân tích, nhưng nếu bạn được trả tiền để làm kỹ thuật thì rất có thể bạn sẽ thấy rằng tổ chức của bạn không (và không thể) cho phép sử dụng bất kỳ thư viện nào được cấp phép theo GPL.
Sarah G

Liên kết đó đã chết
null
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.