2012-06-27 20 views
9

Có khả thi trong Java bằng cách sử dụng api SAX để phân tích danh sách các đoạn XML không có phần tử gốc từ đầu vào luồng không?Phân tích cú pháp danh sách các đoạn XML không có phần tử gốc từ đầu vào luồng

tôi đã cố gắng phân tích như một XML nhưng có một

org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed. 

trước ngay cả những sự kiện endDocument đã bị sa thải.

Tôi không muốn giải quyết bằng các giải pháp rõ ràng nhưng vụng về như "Tiền thêm phần tử gốc tùy chỉnh hoặc Sử dụng phân tích cú pháp phân đoạn đệm".

Tôi đang sử dụng API SAX chuẩn của Java 1.6. Nhà máy SAX đã thiết lậpValidating (false) trong trường hợp ai đó tự hỏi.

+0

Bản sao của http://stackoverflow.com/questions/3232110/parse-file-containing-xml-fragments-in-java. –

+0

Bạn có thể tham khảo [Giải quyết "Đánh dấu trong tài liệu sau phần tử gốc phải được tạo đúng" Ngoại lệ] (http://opensourceforgeeks.blogspot.in/2015/01/resolving-markup-in-document-following.html) –

Trả lời

14

Đầu tiên và quan trọng nhất là nội dung bạn đang phân tích không phải là tài liệu XML. Từ XML Specification:

[Định nghĩa:. Có đúng một phần tử, được gọi là gốc, hoặc thành phần tài liệu, không có phần nào trong số đó xuất hiện trong nội dung của bất kỳ yếu tố khác]

Bây giờ, để phân tích cú pháp này với SAX - bất chấp những gì bạn nói về vụng về - tôi đề nghị phương pháp sau:

Enumeration<InputStream> streams = Collections.enumeration(
    Arrays.asList(new InputStream[] { 
     new ByteArrayInputStream("<root>".getBytes()), 
     yourXmlLikeStream, 
     new ByteArrayInputStream("</root>".getBytes()), 
    })); 

SequenceInputStream seqStream = new SequenceInputStream(streams); 

// Now pass the `seqStream` into the SAX parser. 

Sử dụng SequenceInputStream là một cách thuận tiện để nối nhiều luồng đầu vào vào một luồng đơn. Chúng sẽ được đọc theo thứ tự chúng được truyền cho hàm khởi tạo (hoặc trong trường hợp này - được trả về bởi Enumeration).

Chuyển nó tới trình phân tích cú pháp SAX của bạn và bạn đã hoàn tất.

+0

Đồng ý - lý do cho việc vụng về chắp thêm phần tử gốc là vì bạn đang xử lý dữ liệu vụng về. Nếu không, ngay khi bạn đóng bất kỳ phần tử nào là phần tử đầu tiên bạn đã mở, trình phân tích cú pháp SAX sẽ tin rằng nó đã hoàn thành, như nó có. Tôi cũng làm theo cách này cho một luồng dữ liệu giống như định dạng XML – Woody

+0

Mặc dù bạn đã cung cấp câu trả lời mà tôi đã nghĩ đến, việc triển khai thực hiện thanh lịch hơn nhiều so với những gì tôi từng nghĩ! Cảm ơn bạn vì câu trả lời. – yannisf

+3

Vâng, 'SequenceInputStream' là một trong những tiện ích * đã quên lãng * lâu dài, mà dường như không ai biết, mặc dù đã có từ Java 1.0. Chỉ muốn nhắc nhở nó vẫn còn đó. :) – npe

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