2012-07-14 19 views
5

tôi cảm thấy khá ra chiều sâu của tôi hỏi câu hỏi này, vì mặc dù đọc official docs và các nguồn lực liên kết trong những câu hỏi này:Chơi Framework 2.0 BodyParser - đẩy phân tích cú pháp XML suối

How to understand `Iteratee` in play2?

Can't understand Iteratee, Enumerator, Enumeratee in Play 2.0

... Tôi vẫn còn khá mơ hồ về lặp lại, điều tra viên, và mô hình phản ứng của Play 2.0 nói chung. Tuy nhiên, tôi muốn thiết lập một dịch vụ web cho phép tôi tải lên các tệp XML (> 100MB) lớn, chọn ra một số NodeSeq cụ thể (không xen kẽ), xử lý chúng và truyền kết quả lại cho máy khách.

Tôi tìm điều đầu tiên tôi cần làm là viết một BodyParser có khối byte, cấp chúng cho một trình phân tích cú pháp XML, và phát ra một luồng các NodeSeq mà tôi muốn, nói theo cách lười biếng.

Có ai có thể cung cấp bất kỳ hướng dẫn và/hoặc ví dụ nào minh họa cách thực hiện điều này không?

Cập nhật: Nhiều nền: -

XML của tôi thực sự là một tài liệu Solr add, vì vậy nó trông giống như:

<add> 
    <doc> 
     <field name="name">Some Entity</field> 
     <field name="details">Blah blah...</field> 
     ... 
    </doc> 
    ... 
</add> 

Tôi muốn để xử lý mỗi <doc> một cách trực tuyến, vì vậy phân tích cú pháp của tôi sẽ rõ ràng là phải đợi cho đến khi nó nhấn một sự kiện bắt đầu <doc>, đệm mọi thứ cho đến khi sự kiện kết thúc </doc> tương đương, và phát ra một NodeSeq của phần tử đã hoàn thành và sau đó xóa bộ đệm của nó.

Cách thức này sẽ hoạt động với Play BodyParser, tôi không hoàn toàn chắc chắn. Cập nhật thêm nếu tôi có thể làm rõ thêm những gì tôi muốn làm!

Mặc dù toàn bộ tệp XML là lớn, mỗi phần tử <doc /> của chính nó là khá nhỏ, mặc dù tôi rõ ràng sẽ phải kiểm tra bộ đệm byte không vượt quá một kích thước nhất định.

+0

Bạn cần phải rechunk đúng NodeSeqs của bạn, là có bất kỳ dấu phân cách giữa chúng? làm thế nào để bạn biết rằng một NodeSeq là hoàn thành? – Sadache

+0

Hi @Sadache - Tôi hy vọng làm rõ câu hỏi của tôi về vấn đề này, cảm ơn vì đã có một cái nhìn. – Mikesname

+0

Xin chào, cuối cùng bạn đã tìm được giải pháp chưa? – Loic

Trả lời

3

quét các tài liệu có vẻ như nó chỉ đơn giản là thu thập thông tin này và supplys toàn bộ org.w3c.Document cho Java và một scala.xml cho scala: play xml requests

Điều đó có vẻ rất khó để giúp đỡ trong trường hợp của bạn như bạn' sẽ kết thúc với một mô hình bộ nhớ lớn. Đối với 100MB xml, bạn có thể mong đợi mọi thứ lên đến 700MB sử dụng để phân tích cú pháp.

Rất tiếc, không có thư viện xml nào hiện có (và đã biết) hỗ trợ cho ăn theo khối theo mô hình Iteratee. Scales Xml cung cấp cách xử lý các khối từ một luồng (chuyển một trình phân tích cú pháp kéo thành một Bộ đếm) - xem here để biết các ví dụ.

Hiện tại tôi khuyên bạn nên sử dụng InputStream bình thường (hoặc Reader) và cho nó vào thứ gì đó tương tự như Cân. Có lẽ một chuyên gia Play có thể giới thiệu cách lấy luồng (không xử lý hoàn toàn) từ bên trong khung công tác.

NB: Kết quả hiện tại sẽ sớm hết nhưng bản phát hành chính tiếp theo (0.5) sẽ cố gắng tận dụng aalto-xml để cho phép xử lý luồng một phần này (không chặn) từ cả hai phía.

+0

trình đọc không đồng bộ aalto-xml có vẻ rất thú vị. Nhìn vào http://www.cowtowncoder.com/blog/archives/2011/03/entry_451.html có vẻ như nó có thể được sử dụng trong tình huống này để tạo ra một 'Enumerator' dựa trên liên tiếp' Array [Byte]] '. – huynhjl

+0

Có phải aalto-xml có thể xử lý chuncks (một phần xml) không? Tôi rất muốn xem một số ví dụ ... – Loic

1

Trình phân tích cú pháp Nux dựa trên XOM sẽ chấp nhận đầu vào được chunked và được thiết kế đặc biệt để truyền trực tuyến các tệp XML lớn. Nghe có vẻ giống như những gì bạn muốn.

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