2010-04-22 35 views
5

Có rất nhiều câu hỏi yêu cầu trình phân tích cú pháp XML tốt nhất, tôi quan tâm hơn đến trình phân tích cú pháp XML giống như Groovy cho Java là gì?Cách tốt hơn để thực hiện XML trong Java

Tôi muốn:

SomeApiDefinedObject o = parseXml(xml); 
for(SomeApiDefinedObject it : o.getChildren()) { 
    System.out.println(it.getAttributes()); 
} 

Những điều quan trọng nhất là tôi không muốn tạo ra một lớp cho tất cả các loại nút XML, tôi chỉ muốn đối phó với họ tất cả như dây đàn, và xây dựng XML không đòi hỏi bất kỳ chuyển đổi hoặc bất cứ điều gì, chỉ cần một đối tượng đơn giản mà đã được xác định

Nếu bạn đã sử dụng phân tích cú pháp XML Groovy, bạn sẽ biết những gì tôi đang nói về

Ngoài ra, wou Tôi có thể sử dụng Groovy từ Java tốt hơn không?

+0

@jboyd: bạn nói rằng bạn không muốn tạo các đối tượng ... Nếu tốc độ và bộ nhớ là một mối quan tâm và xác nhận là ** không ** một mối quan tâm, sau đó dự án Javolution có một trình phân tích cú pháp XML "Stax-like" theo thời gian thực (tôi không biết gì về nó, chỉ là nó giống như Stax và trọng tâm của nó là tốc độ, thấp dấu chân và rất ít vật thể tạo ra). – SyntaxT3rr0r

+1

Tôi tự hỏi liệu Java-Land có bất cứ điều gì tương tự như sức mạnh của LINQ-TO-XML không? – ChaosPandion

+0

@WizardOfOdds: Nghe có vẻ như tôi thực sự có nghĩa là "lớp" khi anh viết "đối tượng". –

Trả lời

4

Dưới đây là một cái gì đó nhanh chóng bạn có thể làm với Sun Java Streaming XML Parser

FileInputStream xmlStream = new FileInputStream(new File("myxml.xml")); 
    XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(xmlStream); 
    while(reader.hasNext()){ 
     reader.next(); 
     for(int i=0; i < reader.getAttributeCount(); i++) { 
      System.out.println(reader.getAttributeName(i) + "=" + reader.getAttributeValue(i)); 
     } 
    } 
+0

Ngoài ra, bạn không thể có được cú pháp ngắn gọn như Groovy trong Java. Vì vậy, hoặc sử dụng một API đơn giản hơn hoặc sử dụng Groovy chính nó. –

+0

Điều này rất hữu ích, nhưng không chính xác những gì tôi muốn, vấn đề là XML tôi sẽ nhận được trở lại là phức tạp, nhưng tôi chỉ cần một phần nhỏ của nó ... vì vậy tôi không muốn phải phản ánh chế độ heiarchy XML trong mã java, tôi muốn nó làm điều đó một cách kỳ diệu, có lẽ sử dụng bản đồ với tên – walnutmon

+0

@jboyd: thực ra, đây là một trong số ít câu trả lời ở đây bạn thực sự * không * phải phản ánh phân cấp XML trong mã Java. Của tôi (và của Brian không thể giải thích một cách rõ ràng) là những người khác. Những công việc này khá giống với mã "Tôi muốn" của bạn. –

0

Tôi rất khuyên bạn nên JAXB. Tuyệt vời cho XML < -> Khung đối tượng Java.

0

Đã từng là một trình phân tích cú pháp XML rất nhỏ và đơn giản được gọi là NanoXML. Dường như không còn được phát triển nữa, nhưng nó vẫn có sẵn tại http://devkix.com/nanoxml.php

0

Tôi có kinh nghiệm tốt với XStream. Nó khá nhanh và sẽ tuần tự hóa và deserialize Java đến/từ XML không có lược đồ và mã rất ít Nó chỉ hoạt động ™. Các phân cấp đối tượng Java mà nó xây dựng sẽ trực tiếp phản ánh XML của bạn.

+0

Vì vậy, đó chính xác là những gì anh ấy làm * không * muốn ... –

0

Tôi làm việc với Dozer và Castor để nhận OTOM (Object to Object Mapping).

1

Hình như tất cả các bạn muốn là một DOM API đơn giản, chẳng hạn như cung cấp bởi dom4j. Thực tế đã có một API DOM trong Thư viện chuẩn (các gói org.w3c.dom), nhưng nó chỉ là API, vì vậy bạn cần một triển khai riêng biệt - cũng có thể sử dụng một cái gì đó nâng cao hơn một chút như dom4j.

1

Sử dụng Groovy.

Có vẻ như mục tiêu chính của bạn là có thể truy cập DOM theo cách "tự nhiên" thông qua trình truy cập đối tượng và Java sẽ không cho phép bạn thực hiện việc này mà không xác định lớp học. Groovy, bởi vì nó là "vịt gõ", sẽ cho phép bạn làm điều này.

Lý do duy nhất không sử dụng Groovy là (1) Xử lý XML là một phần rất nhỏ trong ứng dụng của bạn, và/hoặc (2) bạn phải làm việc với những người khác có thể muốn lập trình nghiêm ngặt trong Java.

Dù bạn làm gì, không quyết định "chỉ xử lý tất cả chúng dưới dạng chuỗi". XML không phải là một định dạng đơn giản, và trừ khi bạn biết spec bên trong và bên ngoài, bạn không có khả năng làm cho nó đúng. Điều đó có nghĩa là XML của bạn sẽ bị từ chối bởi các trình phân tích cú pháp tuân thủ đặc tả.

3

Tôi muốn không biết xấu hổ khi cắm thư viện nguồn mở nhỏ mà tôi đã viết để phân tích cú pháp XML trong Java một cách dễ dàng.

Xem Jinq2XML.

http://code.google.com/p/jinq2xml/

Một số mẫu mã sẽ trông giống như:

Jocument joc = Jocument.load(urlOrStreamOrFileName); 
joc.single("root").children().each(new Action() { 
    public void act(Jode j){ 
     System.out.println(j.name() + ": " + j.value()); 
    } 
}); 
+0

này sẽ rất tốt! cảm ơn chia sẻ – boreas

+0

là nó vẫn còn để đọc xml chỉ? Bạn có một phiên bản có thể vận hành tài liệu xml như thêm thuộc tính vào một phần tử không? – boreas

+0

@boreas xin lỗi, nhưng nó vẫn chỉ có khả năng đọc. – jjnguy

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