xml

2010-03-03 11 views
9

में xml को कैसे एम्बेड करें मुझे किसी अन्य XML दस्तावेज़ के भीतर एक संपूर्ण अच्छी तरह से गठित XML दस्तावेज़ एम्बेड करने की आवश्यकता है। हालांकि, मैं बजाय सीडीएटीए (व्यक्तिगत विचलन) से बचूंगा और मैं पार्सर से बचना चाहूंगा जो पूरे दस्तावेज़ को एम्बेडेड एक्सएमएल को पार्स करने में समय बर्बाद करने से प्राप्त करेगा। एम्बेडेड एक्सएमएल काफी महत्वपूर्ण हो सकता है, और मुझे वह कोड चाहिए जो एम्बेडेड एक्सएमएल को मनमानी डेटा के रूप में इलाज करने के लिए पूरी फाइल प्राप्त करेगा।xml

विचार जो तुरंत दिमाग में आया था, बेस 64 में एम्बेडेड एक्सएमएल को एन्कोड करना है, या इसे ज़िप करना है। क्या यह ठीक है?

मैं रास्ते में सी # में कोडिंग कर रहा हूं।

+2

यह एम्बेडेड सॉफ़्टवेयर के बारे में नहीं है और वास्तव में इस तरह टैग नहीं किया जाना चाहिए। –

उत्तर

3

बस एक त्वरित नोट, मैं बेस 64 रूट चला गया हूं और यह ठीक काम करता है लेकिन यह एक कठोर प्रदर्शन जुर्माना के साथ आता है, खासकर भारी उपयोग के तहत। हम इसे 20 एमबी तक दस्तावेज़ खंडों के साथ करते हैं और बेस 64 एन्कोडिंग के बाद वे ज़िप के साथ भी 65 एमबी (टैग और डेटा के साथ) ले सकते हैं।

हालांकि, बड़ी समस्या यह है कि एनईटी बेस 64 एन्कोडिंग एन्कोडिंग/डिकोडिंग करते समय स्मृति को 10x तक का उपभोग कर सकती है और अक्सर ओएम अपवादों को कई धागे पर बार-बार और/या किए जाने पर कर सकती है।

किसी एक व्यक्ति ने एक विकल्प के रूप में ProtoBuf को एक विकल्प के रूप में, साथ ही Fast InfoSet को एक और विकल्प के रूप में अनुशंसित किया।

+0

चूंकि मैं जिस डेटा को एम्बेड करना चाहता हूं वह एक्सएमएल है, इसकी अत्यधिक संपीड़ित है, कुछ परीक्षणों के बाद ऐसा लगता है कि अगर मैं पहली बार बेस 64 में परिवर्तित करने से पहले एक्सएमएल को संपीड़ित करता हूं, तो बाइट्स में परिणामी आकार द्वारा उठाए गए डेटा की मात्रा से लगभग 10% कम होता है कच्चे पूर्व संपीड़न xml। मुझे लगता है कि मैं इस मार्ग को ले जाऊंगा! – tempy

+0

मुझे लगता है कि आप vtd-xml के सी # पोर्ट को आजमा सकते हैं, डीओएम के साथ कई समस्याओं को अच्छी तरह से हल किया गया है, जैसे प्रदर्शन (आपको पार्सिंग के बारे में चिंता करने लगते हैं), और मेमोरी उपयोग, लेकिन यह एक बाहरी उपकरण किट है (नहीं .NET वितरण का हिस्सा) http://vtd-xml.sf.net –

+0

लिंक @ जिमी झांग – GrayWizardx

1

मैं इसे अपने पसंदीदा तरीके से एन्कोड करता हूं (उदा। बेस 64 या एचटीपी सर्वरवरिटी :: UrlEncode, ...) और फिर इसे एम्बेड करें।

5

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

4

ऐसा करने का डब्ल्यू 3 सी-अनुमोदित तरीका XInclude है। .NET http://mvp-xml.sourceforge.net/xinclude/

+2

द।नेट फ्रेमवर्क में XInclude कार्यान्वयन नहीं है। –

+1

मैंने जो लिंक पोस्ट किया है वह XInclude के .NET में C# के कार्यान्वयन के लिए है। –

3

आप XML का निर्माण कैसे करते हैं, इस पर निर्भर करते हुए, एक तरीका यह है कि इसकी परवाह न करें और ढांचे को इसे संभालने दें।

<?xml version="1.0" encoding="utf-8"?> 
<helloworld>&lt;how&gt;&lt;are&gt;&lt;you 
    reply="i am fine"&gt;really&lt;/you&gt;&lt;/are&gt;&lt;/how&gt; 
</helloworld> 
1

आप XML घोषणा (दस्तावेज़ की पहली पंक्ति) की जरूरत नहीं है, बस रूट तत्व सम्मिलित (सभी बच्चे के साथ:

XmlDocument doc = new XmlDocument(); 
doc.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\" ?><helloworld></helloworld>"); 
string xml = "<how><are><you reply=\"i am fine\">really</you></are></how>"; 
doc.GetElementsByTagName("helloworld")[0].InnerText = xml; 

उत्पादन एक HTMLEncoded स्ट्रिंग की तरह कुछ हो जाएगा) किसी मौजूदा तत्व के बच्चे के रूप में अन्य एक्सएमएल दस्तावेज के पेड़ में। सम्मिलित तत्वों को अलग करने के लिए एक अलग नामस्थान का उपयोग करें।

+0

लिंक के लिए धन्यवाद यह अभी भी एम्बेडेड एक्सएमएल को पार्स करने वाले प्राप्त करने वाले अंत में पार्सर का परिणाम होगा, जिसे मैं टालना चाहता हूं । – tempy

+1

@tempy पार्सर को सीडीएटीए या आधार 64 एन्कोडेड डेटा को भी पार्स करना है, यह जांचने के लिए कि यह अच्छी तरह से गठित है और इसे एप्लिकेशन डेटा के रूप में एप्लिकेशन में पास करने के लिए है। आपको यह देखने के लिए बेंचमार्क करना होगा कि संरचना को फेंकने से बेस 64 –

+0

@ पेटे किर्कम में अतिरिक्त बाइट्स को पार्स करने से अधिक या कम लागत कम हो रही है, यह एक अच्छा मुद्दा है ... मुझे जांच करनी होगी। – tempy

-1

मैं इसके लिए टिप्पणियाँ का उपयोग करें:

< - अपने xml पाठ - >

[संपादित]
तो टिप्पणी के साथ एम्बेडेड एक्सएमएल, एक अलग वाक्य रचना के साथ बदलना।

 
<?xml version="1.0" encoding="iso-8859-1" ?> 
<xml> 
    <status code="0" msg="" cause="" /> 
    <data> 
     <order type="07" user="none" attrib="..." > 
     <xmlembeded > 
      <!-- 
       <?xml version="1.0" encoding="iso-8859-1" ?> 
       <xml> 
       <status ret="000 "/> 
       <data> 
       <allxml_here /> 
       <!** embedeb comments **> 
       </data> 
       <xml> 
      --> 
     </xmlembeded > 
     </order> 
     <context sessionid="12345678" scriptname="/from/..." attrib="..." /> 
    </data> 
</xml> 
+1

क्या होगा अगर एम्बेडेड एक्सएमएल में भी टिप्पणी है? क्या यह बाकी को कम नहीं करेगा? –

+0

यह मेरा मामला नहीं है, मुझे पता है कि मैं क्या कर रहा हूं। – lsalamon

+0

यह मेरे लिए थोड़ा सा हैक-आश गंध करता है। टिप्पणियों के आंतरिक एक्सएमएल को स्क्रब करना, जिसे इसे एक संभावित विशाल स्ट्रिंग के रूप में पेश करने की आवश्यकता होगी, बल्कि महंगा हो सकता है और मुझे लगता है कि अन्य तरीकों का उपयोग करके टाला जा सकता है। – tempy

0

आप इस के लिए XSLT का उपयोग नहीं कर सकते हैं? शायद xsl का उपयोग कर: copy या xsl: copy-of? एक्सएसएलटी यही है।