2009-05-16 7 views
13

लोग,सी # में एक फ़ाइल के लिए एक्सएमएल (बड़ा) एक्सएमएल कैसे लिखें?

कृपया, सी # .NET 3.5 में वास्तव में बड़े XML दस्तावेज़ (500 एमबी तक कहने) का एक अच्छा तरीका क्या है? मेरे पास थोड़ी सी खोज है, और ऐसा कुछ भी नहीं मिल रहा है जो इस विशिष्ट प्रश्न को संबोधित करता है।

मेरे पिछले धागा (What is the best way to parse (big) XML in C# Code?) समान परिमाण एक्सएमएल दस्तावेजों को पढ़ने के कवर ... इसके साथ ही हल मैं कैसे एक "update.xml" दस्तावेज़ के लिए अद्यतन सुविधाओं (http://www.opengeospatial.org/standards/sfa) लिखने के बारे में सोचने की जरूरत है।

मेरे विचार: जाहिर है कि दस्तावेज के अधिकतम आकार को उत्पादित करने के लिए एक बड़ा डोम बाहर है। मैं बाध्यकारी वर्गों को स्कीमा बनाने के लिए XSD.EXE का उपयोग कर रहा हूं ... जो XmlSerializer वर्ग के साथ अच्छी तरह से काम करता है, लेकिन मुझे लगता है कि यह "हुड के नीचे" एक डोम बनाता है। क्या ये सही है?। मैं एक ही समय में सभी सुविधाओं (उनमें से 50,000 तक) स्मृति में नहीं रख सकता। मुझे डेटाबेस को फीचर फॉर्म पढ़ने, इसे क्रमबद्ध करने और फ़ाइल में लिखने की आवश्यकता है। तो मैं सोच रहा हूं कि मुझे फ़ाइल में प्रत्येक व्यक्तिगत सुविधा के लिए "डॉकलेट" लिखने के लिए XmlSerializer का उपयोग करना चाहिए। मुझे कोई जानकारी नहीं मिली है (अभी तक) यदि यह भी संभव/व्यवहार्य है।

आपको क्या लगता है?

पृष्ठभूमि: मैं सी # के लिए एक पुराना वीबी 6 मैपइन्फो "क्लाइंट प्लगइन" पोर्ट कर रहा हूं। एक मौजूदा जे 2 ईई "अपडेट सेवा" (वास्तव में केवल एक वेब-ऐप) है जो इस कार्यक्रम (दूसरों के बीच) के साथ काम करना चाहिए। मैं सर्वर नहीं बदल सकता; जब तक अनुपस्थित रूप से आवश्यक नहीं है; विशेष रूप से इसमें अन्य ग्राहकों को बदलना शामिल है। सर्वर एक स्क्रिप्ट के साथ एक XML दस्तावेज़ स्वीकार करता है जो किसी भी नामस्थान को निर्दिष्ट नहीं करता है ... यानी: केवल डिफ़ॉल्ट नामस्थान है, और इसमें सबकुछ है।

मेरा अनुभव: मैं काफी सी # और .NET नौसिखिया हूं। मैं जावा, वीबी, सी, और कुछ सी ++ सहित विभिन्न भाषाओं में लगभग 10 वर्षों के लिए प्रोग्रामिंग कर रहा हूं।

चीयर्स सब। कीथ।

पीएस: यह रात्रिभोज का समय है, इसलिए मैं लगभग आधे घंटे तक AWOL रहूंगा।

उत्तर

16

बड़े xml, XmlWriter (सीधे) लिखने के लिए आपका मित्र है - लेकिन इसका उपयोग करना मुश्किल है। दूसरा विकल्प डोम/वस्तु मॉडल तरीकों का उपयोग और गठबंधन उन्हें, जो शायद संभव है आप XmlWriterSettings का नियंत्रण अपने हाथों व एक्सएमएल मार्कर, अक्षम और नाम स्थान घोषणाओं से छुटकारा पाने के अगर होगा ...

using System; 
using System.Collections.Generic; 
using System.Xml; 
using System.Xml.Serialization;  
public class Foo { 
    [XmlAttribute] 
    public int Id { get; set; } 
    public string Bar { get; set; } 
} 
static class Program { 
    [STAThread] 
    static void Main() { 
     using (XmlWriter xw = XmlWriter.Create("out.xml")) { 
      xw.WriteStartElement("xml"); 
      XmlSerializer ser = new XmlSerializer(typeof(Foo)); 
      XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
      ns.Add("",""); 
      foreach (Foo foo in FooGenerator()) { 
       ser.Serialize(xw, foo, ns); 
      } 
      xw.WriteEndElement(); 
     } 
    }  
    // streaming approach; only have the smallest amount of program 
    // data in memory at once - in this case, only a single `Foo` is 
    // ever in use at a time 
    static IEnumerable<Foo> FooGenerator() { 
     for (int i = 0; i < 40; i++) { 
      yield return new Foo { Id = i, Bar = "Foo " + i }; 
     } 
    } 
} 
+0

मार्क, Merci। (डेविड श्मिट के जवाब पर मेरी टिप्पणी के अनुसार) मैं इसे दोनों तरीकों से आजमाउंगा और कुछ प्रदर्शन परीक्षण चलाऊंगा। मैं आपके विचारशील उत्तर के लिए श्रीमान धन्यवाद, और वह उदाहरण कोड। बहुत बढ़िया। टा। ;-) मुझे उम्मीद है कि मैं किसी दिन पक्ष का भुगतान कर सकता हूं। चीयर्स। कीथ। – corlettk

-1

एक्सएमएल लिखने के लिए बस टेक्स्टवाइटर का उपयोग क्यों नहीं करते?

+0

क्योंकि एक्सएमएल टेक्स्ट नहीं है। –

+5

"...नहीं * बस * पाठ। ";-) – Cerebrus

+0

बिलकुल नहीं। एक्सएमएल इंफोसेट सामग्री (http://www.w3.org/TR/xml-infoset/) देखें। डेटा को इसके प्रतिनिधित्व के साथ भ्रमित न करें। –

9

उपयोग एक XmlWriter:

[...] एक लेखक है कि प्रदान करता है एक तेज, गैर कैश की गई, आगे केवल- पैदा धाराओं या XML डेटा युक्त फ़ाइलों का मतलब है।

+0

लक्ष्य पर स्पॉट! +1 – Cerebrus

+0

ठीक है मैं प्रोटोटाइप में दोनों तरीकों (केवल मुख्य तत्वों के लिए, समय बचाने के लिए) कोशिश करूंगा। XmlWriter " सही जवाब ", लेकिन मुझे लगता है कि इसमें मेरे प्रारंभिक एक्सएमएलएसरिएलाइज़र समाधान की तुलना में बहुत अधिक कोड शामिल होगा, और यह भी समाप्त हो जाएगा ई "लचीलापन" उत्पन्न बाध्यकारी वर्गों का उपयोग करने के लाभ ... क्योंकि हाथ से बना लेखन कोड सभी को सटीक स्कीमा के बारे में पता होना चाहिए। मैं आपके लिए धन्यवाद ... चीयर्स। कीथ। – corlettk

1

क्या आपने इसे डिस्क पर लिखने से पहले इसे संपीड़ित करने पर विचार किया था? एक्सएमएल के साथ आप 10 गुना संपीड़न और भी अधिक तक पहुंच सकते हैं। यह संभवतः फ़ाइल को संपीड़ित करने के लिए कम समय लेगा और पूरे 500 एमबी संस्करण को पढ़ने के लिए संपीड़ित संस्करण लिखें।

+1

बड़ी समस्या यह है कि इन-मेमोरी डीओएम पुनर्भुगतान आमतौर पर वास्तविक अंतर्निहित xml का x10 होता है ... और 5 जीबी समझदारी से संभालने के लिए बहुत बड़ा है। और फिर यह मदद नहीं करता है अगर एक मौजूदा एपीआई/असम्पीडित फ़ाइल की अपेक्षा है। –

+0

यह एक अच्छा विचार है। धन्यवाद। डिस्क को हिट करने से पहले मैं इसे भी संपीड़ित कर सकता हूं; कुछ समय (और मेमोरी) को वापस पढ़ना और उसे HttpWebRequest के रूप में भेजना। इस एक्सएमएल के साथ हमारा अनुभव इसके विस्फोटित आकार के लगभग एक चौथाई तक संकुचित है ... बचत (3/4) * 500 = 375 एमबी रैम। – corlettk

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