2011-08-05 15 views
11

मैं सोच रहा था कि क्या .NET लाइब्रेरी या एक्सएमटी दस्तावेज़ों पर LINQ क्वेरीज़ जैसे एंटीटी फ्रेमवर्क को निष्पादित करने के लिए एक तृतीय पक्ष टूल है। मुझे पता है कि पहले से ही LINQ से XML है जो आपको XDocument ऑब्जेक्ट पर क्वेरी निष्पादित करने की अनुमति देता है जो ALREADY स्मृति में लोड हो गया है, लेकिन क्या होगा यदि XML दस्तावेज़ आकार में बहुत बड़ा है (गीगाबाइट पर)?लिंक से एक्सएमएल, उपज और अन्य

मैं इस प्रश्न को XmlReader पर XDocument ऑब्जेक्ट पर रखने का विकल्प चुनना चाहता हूं। क्या यह सीधे बॉक्स से बाहर है?

+0

ठीक है, खोज में थोड़ा और अधिक मैं इस सूत्र से टकरा कर लेने के बाद: http://stackoverflow.com/questions/2441673/reading-xml-with-xmlreader-in-c और यह: http://blogs.msdn.com/b/xmlteam/archive/2007/03/24/streaming-with-linq-to-xml-part-2.aspx मैं लगभग सटीक तकनीक का उपयोग करके इस समस्या को हल करने के बारे में सोच रहा हूं , लेकिन इसमें अभी भी पूर्ण समर्थन और बेहतर प्रदर्शन की कमी है। –

उत्तर

3

this codeplex project पर एक नज़र डालें।

+0

बिल्कुल वही जो मैं खोज रहा था, मुझे जिस तरह से कोड किया गया है उससे भी प्यार है! धन्यवाद! –

1

मेरा मानना ​​है कि नहीं आप एक समाधान है कि सभी एक्सएमएल दस्तावेजों फिट होगा होगा, लेकिन आप यह कर सकते हैं।

मैं ऐसी कक्षा तैयार करूंगा जो IEnumerable<T> लागू करता है और XmlReader लेता है जिसे आप स्ट्रीम करना चाहते हैं।

फिर, मैं उस प्रकार का निर्माण करूंगा जिसका उपयोग IEnumerable<T> के कार्यान्वयन में टाइप पैरामीटर T के लिए किया जाएगा।

एक बार जब आप किया है कि, GetEnumerator के अपने कार्यान्वयन में, आप विभिन्न Move* और Read* जो आप T का एक उदाहरण के निर्माण के लिए अनुमति देगा XmlReader पर तरीकों कॉल करेगा।

जब आपके पास T का उदाहरण है, तो आप आइटम को उत्पन्न करने के लिए yield return का उपयोग करेंगे। GetEnumerator का शेष निकाय उचित रूप से लूप होगा क्योंकि आप XmlReader के माध्यम से स्ट्रीम करते हैं।

हाथ में, आप T के उदाहरणों को स्ट्रीम करते हैं, जैसे आप उन्हें प्राप्त करते हैं, पूरे दस्तावेज़ को स्मृति में पहले स्थान पर लोड किए बिना।

आपको निश्चित रूप से परीक्षण करना होगा कि आप एक समय में कितना दस्तावेज़ पढ़ना चाहते हैं।

+0

धन्यवाद, ऊपर बताई गई तकनीक का उपयोग करके कुछ समान समाधान मिलते हैं, लेकिन मुझे पोस्ट किया गया तीसरा पक्ष टूल jdv पसंद था। –

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