2009-08-28 59 views
8

Lớp nào tốt nhất trong Java để làm việc với các tài liệu XML?Lớp xử lý XML tốt nhất trong Java

+1

Thật kỳ lạ là hầu hết các khung công tác Java phụ thuộc rất nhiều vào XML nhưng Java, ngôn ngữ, có hỗ trợ XML rất nghèo so với Python, ví dụ. –

+3

Vui lòng xác định "tốt nhất". – Bombe

+4

Lưu ý rằng ngôn ngữ lập trình được gọi là "Java", và nó không phải là một từ viết tắt, vì vậy nó không nên được viết với tất cả chữ hoa "JAVA". – Jesper

Trả lời

19

Nó thực sự phụ thuộc vào những gì bạn muốn làm với tài liệu XML và tài liệu lớn như thế nào.

đại khái, bạn có thể phân loại API XML như:

  • DOM API - tải toàn bộ tài liệu vào bộ nhớ, làm hạn chế kích thước của tài liệu bạn có thể xử lý, nhưng sau đó có thể tạo ra các cấu trúc tối ưu hóa cho hàng hải và chuyển đổi
  • API phát trực tiếp - ứng dụng của bạn phải diễn giải các sự kiện phân tích ở mức độ thấp (ví dụ: bắt đầu phần tử, phần tử kết thúc, v.v.) nhưng bạn không bị giới hạn bởi bộ nhớ. Có hai loại API trực tuyến - đẩy và kéo. Đẩy phân tích cú pháp các sự kiện phân tích cú pháp lửa tại một đối tượng bạn xác định và đối tượng đó phải theo dõi trạng thái phân tích cú pháp hiện tại, ví dụ như máy hoặc ngăn trạng thái). Trình phân tích cú pháp kéo cho phép các sự kiện phân tích cú pháp kéo ứng dụng của bạn từ trình phân tích cú pháp. Điều này giúp dễ dàng viết một trình phân tích cú pháp gốc đệ quy để xử lý nội dung XML, nhưng sau đó kích thước ngăn xếp trở thành một giới hạn về kích thước của tài liệu bạn có thể xử lý.
  • Trình ánh xạ XML - ánh xạ nội dung XML tới các đối tượng Java. Có hai phương pháp chính để ánh xạ XML: mã-gen hoặc sự phản chiếu. Những người lập bản đồ mã-gen tạo ra các lớp Java từ một lược đồ XML, có nghĩa là bạn không phải sao chép cấu trúc lược đồ trong mã Java nhưng có bất lợi là mã Java của bạn phản ánh chính xác cấu trúc lược đồ. Ngoài ra, hầu hết các trình tạo mã tạo ra các lớp NOJO khó xử khi làm việc và không có hành vi của riêng chúng. Các trình ánh xạ phản chiếu cho phép bạn viết các lớp Java với hành vi phong phú và sau đó xác định cách chúng được ánh xạ tới/từ XML. Nếu bạn cần tuân theo lược đồ được xác định trước, bạn sẽ phải đảm bảo rằng các lớp và cấu hình ánh xạ của bạn chính xác là w.r.t. lược đồ đó.

Một số tùy chọn có sẵn là:

  • DOM API: DOM API trong thư viện chuẩn được chuẩn (rõ ràng!) Và do đó tương thích với các thư viện khác, nhưng họ là khủng khiếp. Có một số API giống như DOM thuận tiện hơn, chẳng hạn như XOM (yêu thích của tôi cho cùng một lý do mà Adam Batkin đưa ra ở trên) hoặc JDOM. Hãy xem xét một vài và quyết định API nào bạn thích.
  • API phát trực tuyến: thư viện chuẩn chứa triển khai trình phân tích cú pháp đẩy SAX. Trình phân tích cú pháp kéo tiêu chuẩn cho Java là StAX.
  • API ánh xạ: JAXB là tiêu chuẩn JSR nhưng tôi thích XStream vì tôi có thể dễ dàng tách cấu hình ánh xạ khỏi các lớp được ánh xạ (không cần chú thích hoặc cấu hình XML) và nó ánh xạ đối tượng đến/từ các định dạng dữ liệu khác.
+0

+1 cho: nó phụ thuộc "- và những gì nó phụ thuộc vào. –

+0

VTD-XML Tốt hơn là dom sax, và kéo ở đây là bằng chứng: http://sdiwc.us/digitlib/journal_paper.php?paper=00000582 .pdf –

1

Tôi nghĩ rằng đó là JDOM để dễ sử dụng.

0

Có rất nhiều thư viện cho phép bạn xử lý XML theo nhiều cách khác nhau và không có cách nào là "tốt nhất". Như mọi khi, nó phụ thuộc vào những gì bạn đang cố gắng làm và yêu cầu của bạn là gì.

Khi tôi cần trình phân tích cú pháp giống DOM hoặc để tạo tài liệu XML, cá nhân tôi thích XOM vì nó đảm bảo rằng các tài liệu XML được tạo đúng và "đúng". Ưu tiên số một của nó là đúng đắn, điều quan trọng khi tương tác với các hệ thống khác, một cái gì đó mà XML thực hiện rất tốt. API của nó cũng được thiết kế rất tốt và trực quan, khiến cho các hoạt động phổ biến trở nên rất dễ dàng.

3

Tôi tìm thấy dom4j để xuất hiện trên mọi thứ khác mà tôi đã sử dụng (đặc biệt là JDOM, mà tôi thấy có API đặc biệt kém). dom4j cũng cho phép cắm vào số Jaxen để được hỗ trợ XPath.

Ví dụ:

SAXReader reader = new SAXReader(); // dom4j SAXReader 
    Document document = reader.read(xmlInputStream); // dom4j Document 

    // select all link nodes with href "http://example.com" 
    List<Element> linkNodes = document.selectNodes("//link[@href='http://example.com']"); 

    // select an attribute value 
    String val = linkNodes.get(0).attributeValue("href"); 

    // select element text and trim it 
    String value = document.elementTextTrim("childNode"); 
1

Tôi đã có may mắn với JAXB. Nó được bao gồm trong Java SE 6.

+0

JAXB là một giải pháp ràng buộc OXM, không phải là một trình phân tích cú pháp XML chung. Nó sử dụng một trình phân tích cú pháp XML, nhưng nó không phải là một chính nó. – duffymo

+2

Có, nhưng câu hỏi không phải là về trình phân tích cú pháp XML chung. Đó là "Lớp nào tốt nhất trong Java để làm việc với các tài liệu XML?". Và JAXB chắc chắn là một trong những lựa chọn thay thế. –

0

Tôi thích sử dụng kết hợp DOM và SAX cổ điển.

0

Bạn phải quyết định giữa hai cách tiếp cận khác nhau để xử lý XML: Có DOMSAX, cả hai đều có ưu điểm và nhược điểm. Tất cả phụ thuộc vào nhu cầu của bạn và kích thước của tài liệu XML mà bạn muốn xử lý. Đã đề cập đến việc xây dựng một API ở trên cả hai và được vận chuyển với Java 6.

Khi bạn hiểu điều này, bạn có thể muốn đặt câu hỏi cụ thể và có thể yêu cầu DOM tốt nhất hoặc triển khai SAX tốt nhất. Bên cạnh đó, nó sẽ là tốt nếu bạn có thể nói sử dụng những yêu cầu của bạn là gì. Bạn có muốn viết hoặc đọc XML không? Các tệp sẽ lớn đến mức nào? Và cứ thế.

EDIT:

Như Nat chỉ ra, đó cũng là StAX như một khái niệm thay thế thứ ba.

+0

Ngoài ra còn có StAX, mức thấp như SAX nhưng cho phép mã khách hàng kéo các sự kiện XML từ luồng thay vì xử lý các sự kiện được đẩy vào nó từ trình phân tích cú pháp. Điều này giúp dễ dàng viết các trình phân tích cú pháp gốc đệ quy để xử lý nội dung XML. – Nat

+0

@Nat: Không bao giờ sử dụng điều đó, cảm ơn mẹo! Chỉ cần chỉnh sửa câu trả lời của tôi và bao gồm một liên kết. –

0

Nếu bạn chỉ đang đọc, thì XPath là một cược tốt. Nếu không, DOM (trong gói org.w3c.dom) là đặt cược tốt nhất của bạn.

+0

"tốt nhất" không được định nghĩa là dễ hiểu và dễ hiểu nhất. Và tôi thấy các giao diện trong org.w3c.dom, vì vậy bạn vẫn cần thực hiện một số loại. – duffymo

0

Java có hỗ trợ tốt cho XML. Vấn đề trong một ý nghĩa là có rất nhiều lựa chọn. Vì vậy, không có một giải pháp nào là "cách" để xử lý XML trong Java. Bạn phải chọn công cụ của mình dựa trên sự cố trong tầm tay.

Giả sử bạn có tài liệu được xác thực phức tạp mà bạn muốn tải vào cây đối tượng mà sau đó bạn có thể truy vấn và thao tác cây. Bạn sẽ cần một trình phân tích cú pháp DOM cho điều này và có một số để chọn. Điều này chuyển đổi toàn bộ tài liệu thành các đối tượng, có thể tốn kém về mặt CPU.

Giả sử bạn có tài liệu mà bạn muốn chọn ra các yếu tố nhất định và hiệu suất là một vấn đề. Hãy thử trình phân tích cú pháp SAX, trình phân tích cú pháp kéo hoặc XPath.

Có lẽ bạn cần sắp xếp các đối tượng nguyên soái/không đối xứng trên dây. JAXB là một ứng cử viên cho điều này, cũng như các tùy chọn khác.

Vì vậy, không có câu trả lời đúng cho câu hỏi của bạn. Như với bất kỳ vấn đề [lập trình] nào, bạn phải xem xét vấn đề, đánh giá các tùy chọn và chọn công cụ tốt nhất cho công việc.

0

Bất cứ khi nào tôi cần làm việc với tài liệu XML, tôi luôn nghĩ dom4j/sax là khu nghỉ mát đầu tiên và không bao giờ cho phép tôi xuống. ;)

Bạn nên xem xét SAXReader.

0

@Epaga, nếu bạn không đặt "tốt nhất" trong ngữ cảnh, bạn sẽ thất bại thảm hại.

Ví dụ: cố gắng tải một XML lớn trong cấu trúc DOM giống như sẽ rất ngu ngốc. Bạn phải chọn công cụ một cách khôn ngoan.

0

XOM (http://www.xom.nu) là một bộ công cụ XML đơn giản, linh hoạt mà tôi đã tìm thấy đơn giản và dễ sử dụng hơn nhiều trình phân tích cú pháp khác. Kể từ khi chuyển đổi từ các công cụ dựa trên chuẩn W3C, năng suất của tôi đã tăng đáng kể. Trong các trang web của mình, tác giả Elliotte Rusty Harold giải thích tại sao thiết kế của XOM là mô hình thích hợp cho một DOM XML.

Các vấn đề liên quan