2012-07-14 15 views
5

मैं इस सवाल पूछ रहे हैं, के बाद से मेरी गहराई से बाहर नहीं बल्कि महसूस धाराओं official docs पढ़ने के बावजूद और संसाधनों इन सवालों में जुड़े हुए:प्ले फ्रेमवर्क 2.0 BodyParser - XML ​​पार्स धक्का

How to understand `Iteratee` in play2?

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

... मैं अभी भी सामान्य रूप से iteratees, enumerators, और Play 2.0 के प्रतिक्रियाशील मॉडल के बारे में बहुत आलसी हूं। लेकिन वैसे भी, मैं एक वेब सेवा स्थापित करना चाहता हूं जो मुझे बड़ी एक्सएमएल (> 100 एमबी) फाइलें अपलोड करने की अनुमति देता है, कुछ विशिष्ट (गैर-इंटरलीव किए गए) नोडसेक्स को चुनें, उन्हें संसाधित करें, और परिणामों को क्लाइंट को वापस स्ट्रीम करें।

मुझे लगता है कि मुझे सबसे पहले जो करना है वह एक बॉडी पार्सर लिखता है जो बाइट्स के टुकड़े लेता है, उन्हें एक एक्सएमएल पार्सर में खिलाता है, और नोडसेक्स की एक धारा को उत्सर्जित करता है, जो आलसी तरीके से <doc>...</doc> कहता है।

क्या कोई भी मार्गदर्शन और/या उदाहरण प्रदान कर सकता है कि यह कैसे पूरा किया जा सकता है?

अद्यतन: अधिक पृष्ठभूमि: -

मेरे एक्सएमएल वास्तव में, एक Solr add दस्तावेज है तो ऐसा लगता है कि:

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

मैं एक स्ट्रीमिंग तरीके से एक <doc> कार्रवाई करने के लिए चाहते हैं, तो मेरे पार्सर होगा स्पष्ट रूप से तब तक इंतजार करना पड़ेगा जब तक कि यह <doc> प्रारंभ ईवेंट को हिट न करे, समकक्ष </doc> अंत ईवेंट तक सबकुछ बफर करें, और पूर्ण तत्व के नोडसेक को छोड़ दें, और फिर उसके बफर को फ्लश करें।

यह Play BodyParser के साथ कैसे काम करेगा, मुझे पूरी तरह से यकीन नहीं है। अधिक अपडेट अगर मैं और स्पष्ट कर सकता हूं कि मैं क्या करना चाहता हूं!

हालांकि संपूर्ण एक्सएमएल फ़ाइल बड़ी है, प्रत्येक <doc /> तत्व स्वयं ही छोटा है, हालांकि मुझे स्पष्ट रूप से यह जांचना होगा कि बाइट बफर एक निश्चित आकार से अधिक नहीं था।

+0

आप ठीक से अपने NodeSeqs rechunk की जरूरत के लिए एक समाधान का वर्णन करता है, उनके बीच कोई विभाजक है? आप कैसे जानते हैं कि एक नोडसेक पूरा हो गया है? – Sadache

+0

हाय @ सादाचे - मैंने इस संबंध में मेरे प्रश्न को स्पष्ट रूप से स्पष्ट किया है, एक नज़र रखने के लिए धन्यवाद। – Mikesname

+0

हाय, क्या आपको अंततः समाधान मिला? – Loic

उत्तर

3

डॉक्स ऐसा लगता है यह केवल इस जानकारी एकत्र करता है और जावा के लिए एक पूरे org.w3c.Document और स्केला के लिए एक scala.xml supplys स्कैन: यह अत्यधिक तुम 'के रूप में अपने मामले में मदद करने के लिए संभावना नहीं लगता है play xml requests

स्मृति मॉडल में एक बड़ा के साथ खत्म हो जाएगा। 100 एमबी एक्सएमएल के लिए आप पार्स करने के लिए 700 एमबी तक की कुछ भी उम्मीद कर सकते हैं।

दुर्भाग्यवश वर्तमान में उपलब्ध (और ज्ञात) xml पुस्तकालयों में से कोई भी Iteratee मॉडल के अनुसार भाग में फ़ीडिंग का समर्थन नहीं करता है। Scales Xml एक धारा से भाग को संसाधित करने का एक तरीका प्रदान करता है (पुल पार्सर को एन्यूमेरेटर में बदलना) - उदाहरण के लिए here देखें।

इस प्रकार वर्तमान में मैं सामान्य इनपुटस्ट्रीम (या रीडर) लेने और स्केल के समान कुछ में इसे खिलाने की अनुशंसा करता हूं। शायद एक प्ले विशेषज्ञ फ्रेमवर्क के भीतर से एक धारा (पूरी तरह से संसाधित किए बिना) को पुनर्प्राप्त करने की सिफारिश कर सकता है।

एनबी: वर्तमान फाइनल जल्द ही समाप्त हो गया है लेकिन अगली बड़ी रिलीज (0.5) aalto-xml का लाभ उठाने का प्रयास करेगी ताकि दोनों पक्षों से इस आंशिक धारा प्रसंस्करण (गैर-अवरोध) को अनुमति मिल सके।

+0

एल्टो-एक्सएमएल एसिंक पाठक बहुत दिलचस्प लगता है। Http://www.cowtowncoder.com/blog/archives/2011/03/entry_451.html देख रहे हैं ऐसा लगता है कि इस स्थिति में लगातार 'ऐरे [बाइट]] 'के आधार पर' गणनाकर्ता 'उत्पन्न करने के लिए इसका उपयोग किया जा सकता है। – huynhjl

+0

क्या एल्टो-एक्सएमएल चंक्स (आंशिक एक्सएमएल) को संभालने में सक्षम है? मुझे कुछ उदाहरण देखने में बहुत दिलचस्पी होगी ... – Loic

1

Nux एक्सओएम पर आधारित पार्सर खंडित इनपुट स्वीकार करेगा और विशेष रूप से बड़ी एक्सएमएल फाइलों को स्ट्रीम करने के लिए डिज़ाइन किया जाएगा। यह वही लगता है जो आप चाहते हैं।

संबंधित मुद्दे