2010-11-15 18 views
8

मैं एक एक्सएमपीपी एक्सएमएल स्ट्रीम पार्सिंग के साथ खेल रहा हूं। एक्सएमएल स्ट्रीम के बारे में मुश्किल बात यह है कि स्टार्ट टैग सत्र के अंत तक बंद नहीं होता है, यानी एक पूर्ण डोम कभी प्राप्त नहीं होता है।XmlReader से XElement पढ़ें

<stream:stream> 
    <features> 
     <starttls /> 
    </features> 
    .... 
    network session persists for arbitrary time 
    .... 
</stream:stream> 

मुझे यह सुनिश्चित किए बिना स्ट्रीम से XML तत्वों को पढ़ने की आवश्यकता है कि रूट तत्व बंद नहीं किया गया है।

आदर्श रूप से यह काम करेगा लेकिन ऐसा नहीं है और मैं यह मान रहा हूं क्योंकि पाठक रूट तत्व को बंद करने की प्रतीक्षा कर रहा है।

XElement someElement = XNode.ReadFrom(xmlReader) as XElement; 

नीचे कोड (जो मैं Jacob Reimers से उधार) काम करता है, लेकिन मैं वहाँ आशा करती हूं कि अधिक प्रभावी हो सकता है कि एक नए XmlReader बनाने और स्ट्रिंग पार्सिंग करने वाले को शामिल नहीं करता है।

XmlReader stanzaReader = xmlReader.ReadSubtree(); 
stanzaReader.MoveToContent(); 
string outerStanza = stanzaReader.ReadOuterXml(); 
stanzaReader.Close(); 
XElement someElement = XElement.Parse(outerStanza); 

उत्तर

10

आपको तारों के साथ काम करने की आवश्यकता नहीं है; आप सबट्री पर XElement.Load उपयोग करने के लिए सक्षम होना चाहिए:

XElement someElement; 
using(XmlReader stanzaReader = xmlReader.ReadSubtree()) { 
    someElement = XElement.Load(stanzaReader); 
} 

और ध्यान दें कि यह वास्तव में एक 'नई' एक्सएमएल-रीडर नहीं है - यह भारी बाहरी पाठक से जुड़ा हुआ है (लेकिन विवश एक सेट के लिए नोड्स के)।

+0

आपके उदाहरण को देखते हुए मैं नहीं देख सकता कि XmlReader stanzaReader = XElement.Load (xmlReader.ReadSubtree()) नौकरी नहीं करेगा। मेरे पास अभी भी एक ब्लॉक ब्लॉक में xmlReader होगा और यह किसी भी सफाई का ख्याल रखेगा। – sipwiz

+0

@sipwiz - उस विशेष मामले में आप शायद इससे दूर हो जाएंगे; मैं बस गहराई से शामिल हूं: तत्काल * हर * 'IDISposable' का निपटान करें। 'stanzaReader' अंततः एक अलग वस्तु है। –

+0

.net के पुल पार्सर के पहले संस्करण बफर करने के लिए 4kB के लिए प्रतीक्षा करेंगे। यही कारण है कि मैंने जेम्स क्लार्क के एक्सपी पार्सर को जावा से सी # के लिए जाबर-नेट के लिए पोर्ट किया। –

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