2010-05-20 20 views
5

मैं एक टेक्स्ट बॉक्स बनाना चाहता हूं जो एक्सएमएल फाइल लोड करता है और उपयोगकर्ताओं को उन्हें संपादित करने देता है। हालांकि, मैं लोड करने के लिए XmlDocument का उपयोग नहीं कर सकता क्योंकि फाइलें बहुत बड़ी हो सकती हैं। मैं एक्सएमएल दस्तावेज़ को खंडों में स्ट्रीम/लोड करने के विकल्पों की तलाश में हूं ताकि मुझे स्मृति त्रुटियों से बाहर न हो - साथ ही प्रदर्शन भी महत्वपूर्ण है। क्या आप मुझे बता सकते हैं कि अच्छे विकल्प क्या होंगे?बहुत बड़ी एक्सएमएल फाइलें संपादित करें

उत्तर

-2

आप शायद XmlTextReader खोज रहे हैं।

+0

XmlTextReader प्रदान करता है आगे केवल-ओनली पहुंच पढ़ा है? मुझे एक्सएमएल को संपादित करने और फ़ाइल में सहेजने की क्षमता प्रदान करने की आवश्यकता है। मुझे पाठ बॉक्स में भाग को लोड करने में सक्षम होना चाहिए क्योंकि उपयोगकर्ता स्क्रॉल करता है - अगर मेरा दृष्टिकोण गलत है तो मुझे सही करें। धन्यवाद! – Matt

+0

-1: XmlTextReader को बहिष्कृत किया गया है। इसके बजाय 'XmlReader.Create' का उपयोग करें। –

2

Scintilla.NET आज़माएं, यह टेक्स्टबॉक्स से मील बेहतर है!

http://scintillanet.codeplex.com/

दस्तावेज़ लोड हो रहा है आसान है:

using (TextReader reader = new StreamReader(myFilePath, Encoding.UTF8)) 
{ 
    scintillaDocument.Text = reader.ReadToEnd(); 
} 

या:

scintillaDocument.Text = File.ReadAllText(myFilePath); 
+0

यय! किसी ने मेरी पोस्ट पर -1 को कम किया है ... – code4life

+0

यह मैं -1 नहीं था लेकिन पाठक। ReadToEnd() कुछ बहुत बड़ी एक्सएमएल फाइलों के साथ काम नहीं करेगा। मैं Scintillanet से परिचित नहीं हूँ, लेकिन क्या पूरे दस्तावेज़ को स्मृति में लोड करने का कोई तरीका नहीं है? – kenny

+0

@ केनी: हम्म ... मुझे लगता है कि आपको XmlTextReader की आवश्यकता होगी, और नियंत्रण के लिए एक्सएमएल के सेगमेंट लोड करें। उपयोगकर्ता को दस्तावेज़ टेक्स्ट को संपादित करने के लिए, आपको पाठ को पीछे और आगे पढ़ने के लिए कुछ अतिरिक्त कोड लिखना होगा। मैं देखूंगा कि मैं कुछ पोस्ट कर सकता हूं या नहीं। – code4life

1

मैं बहुत बड़ी एक्सएमएल फाइल (1 + गिग) का सामना करना पड़ा और तत्वों को पार्स करने के लिए किया था एक mySQL डेटाबेस में आयात करने के लिए बाहर। मैं टेक्स्ट-आधारित स्ट्रीम रीडर का उपयोग करके सफल रहा था। क्या मैंने किया था मात्रा में पढ़ने रखने के लिए जब तक मैं एक पूरा एकल एक xml जाना जाता

`<perRecordTag>` 

    <other data/node elements> 

`</perRecordTag>` 

तब के आधार पर की "रिकॉर्ड", मैं एक XMLDocument करना होगा (अग्रणी के बाद और अनुगामी स्ट्रिंग से पढ़ने के लिए किया था रिकॉर्ड के) छीन लिया। मैं फिर उस रिकॉर्ड के किसी भी रिकॉर्ड का विश्लेषण, समीक्षा, आगे बढ़ सकता हूं।

जाहिर है, मुझे अगले पढ़ने वाले रिकॉर्ड तत्व की शुरुआत शुरू करने के लिए एक्सएमएल रिकॉर्ड के अंत के बाद सभी को बरकरार रखना था, लेकिन यह कोई समस्या नहीं थी।

1

मुझे सीएसवी फ़ाइल डेटा के साथ इस तरह की चीज करने के लिए सिमिमलर मुद्दे हैं।

डीआरएपी सही है, यह संभावना है कि उपयोगकर्ता एक स्थिति में रूट स्तर पर सबकुछ पढ़ने की उम्मीद नहीं कर रहा है, इस स्थिति से संपर्क करने का सबसे साफ तरीका है।

सिद्धांत रूप में आपको सावधान रहना चाहिए कि खुले या बंद क्या हैं लेकिन आप केवल इस कोर जानकारी को स्ट्रिंग में स्टोर कर सकते हैं और यह बहुत भारी नहीं होना चाहिए।

और जैसा कि ड्रैप सुझाव देता है कि आप बस एक स्ट्रीम में डेटा लोड करते हैं और कुछ सावधानीपूर्वक स्थिति प्रबंधन के साथ आपको पढ़ने और लिखने में सक्षम होना चाहिए।

आपकी सबसे बड़ी समस्या यह है कि यदि बिंदु x पर कहा गया है कि आप डेटा को अलग-अलग लंबाई के कुछ डेटा के साथ नोड वाई में बदलना चाहते हैं तो आप या तो फ़ाइल में एक अंतर के साथ समाप्त हो जाएंगे या आप अगले नोड/ए को ओवरराइट करेंगे इसका हिस्सा

इसलिए हर बार एक chnage अनिवार्य रूप से बनाया जाता है, तो आपको फ़ाइल को उस बिंदु तक दूसरी स्ट्रीम में स्ट्रीम करने की आवश्यकता होती है जहां संपादन शुरू होता है, फिर संपादन में स्ट्रीम होता है और शेष फ़ाइल में स्ट्रीम करता है।

आपको यह सब स्ट्रीम रीडर और स्ट्रीम लेखक ऑब्जेक्ट्स के साथ करने में सक्षम होना चाहिए जो आप मूल फ़ाइल पर 1 स्ट्रीम इंस्टेंस के शीर्ष पर बैठते हैं और दूसरी temp फ़ाइल पर एक स्ट्रीम लेखक हैं।

हालांकि यह कभी भी तेज नहीं होगा, क्योंकि पूरी तरह से 1.x गीग फ़ाइल में अपडेट लिखना हार्ड ड्राइव पर समय लगता है और कोई अनुकूलन इसे बदलने वाला नहीं है।

+0

अच्छी तरह से कहा ... और जैसा कि आपने नोट किया है, एक पैरालेटेड आउटपुट फ़ाइल का उपयोग लिखित स्ट्रीम के रूप में किया जाएगा ... जो कुछ भी हो, उसे उपयोगकर्ता को दें, फिर परिणाम को दूसरी फ़ाइल में लिखें। संपादन के लिए जो भी आधार कहा जाता है उसके अगले रिकॉर्ड पर काम करें। – DRapp

1

आप बड़ी फ़ाइलों को संभालने के लिए स्मृति-मैप की गई फ़ाइलों का उपयोग कर सकते हैं।एमएसडीएन पर MemoryMappedFile Class देखें। ठीक है, यह कम स्तर है, लेकिन मदद कर सकते हैं। .NET 4.

से उपलब्ध आप XMLNameTable समर्थन के साथ पाठकों का उपयोग कर सकते हैं। यह स्ट्रिंग इंटर्निंग सक्षम करेगा, इसलिए यदि किसी दस्तावेज़ में स्ट्रिंग अक्सर दिखाई देती है तो एक ही स्ट्रिंग आपके लिए स्मृति में इसका प्रतिनिधित्व करेगी।

आप तृतीय पक्ष XML पार्सर भी आजमा सकते हैं। जैसे Altova XML कंपनी के उत्पादों में उपयोग किया जाता है, इसलिए शायद यह अंतर्निहित .NET कक्षाओं की तुलना में अधिक चीजें कर सकता है। बीटीडब्ल्यू यह मुफ़्त है।

+0

बहुत दिलचस्प है। – ScottE

2

एक्सएमएलएल दस्तावेज़ में xml पढ़ने के साथ परेशान क्यों है यदि आप जो भी कर रहे हैं उसे टेक्स्टबॉक्स में दबा रहा है?

आप यहां कितने बड़े बात कर रहे हैं? क्या आपने इसे अभी तक एक टेक्स्टबॉक्स में स्ट्रीम करने का प्रयास किया है?

sometextarea.Text = System.IO.File.ReadAllText(Server.MapPath("somexml.xml")); 

अब, यह वापस फाइल सिस्टम के लिए बचत एक अलग कहानी है, खासकर यदि आप इसे होने की 1. मान्य XML और 2. एक स्कीमा के खिलाफ मान्य चाहते है।

+0

एक बात स्कॉटई का अर्थ हो सकता है (या लागू होना चाहिए) यह है कि आप पूरी फाइल को टेक्स्ट बॉक्स में नहीं ले पाएंगे, इससे कोई फर्क नहीं पड़ता कि आप और क्या करते हैं। –

0

मुझे लगता है कि आप यहां अपने टेक्स्ट बॉक्स में बहुत कुछ करने की कोशिश कर रहे हैं। उपयोगकर्ताओं को XML दस्तावेज़ को उस टूल में क्यों संपादित नहीं किया गया है जिसका उपयोग XML को संपादित करने के लिए किया गया है? ऐसा टूल भी बड़ी एक्सएमएल फाइलों को संभालने में सक्षम हो सकता है।

फिर, जब एक्सएमएल संपादित किया गया है, तो उपयोगकर्ता आपकी साइट पर पूरा XML दस्तावेज़ अपलोड कर सकते हैं।

0

मैंने इसे बड़ी फ़ाइलों के साथ नहीं देखा है, लेकिन आपको माइक्रोसॉफ्ट के एक्सएमएल नोटपैड 2007 को देखना चाहिए। यह 3 एमबी दस्तावेज़ के लिए दूसरे लोड समय के तहत दावा करता है। यह नहीं है -

http://www.microsoft.com/download/en/details.aspx?id=7973

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