2009-03-07 17 views
19

क्या कोई जानता है कि मैं System.Xml.XmlReader की वर्तमान पंक्ति संख्या कैसे प्राप्त कर सकता हूं? मैं रिकॉर्ड करने की कोशिश कर रहा हूं कि फ़ाइल में मुझे एक्सएमएल तत्व मिलते हैं। IXmlLineInfo इंटरफ़ेस काSystem.Xml.XmlReader (C# और .Net) से वर्तमान पंक्ति संख्या

उत्तर

35

लाभ उठाएं एक XmlReader द्वारा समर्थित:

IXmlLineInfo xmlInfo = (IXmlLineInfo)reader; 
int lineNumber = xmlInfo.LineNumber; 
+2

खराब अभ्यास की तरह दिखता है। चूंकि XmlReader IXmlLineInfo का वारिस नहीं करता है, तो इस सारणी वर्ग के कार्यान्वयन इंटरफ़ेस को लागू नहीं कर सकते हैं। इंटरफ़ेस के समर्थन के लिए एक चेक की आवश्यकता है। – SerG

+1

IXmlLineInfo xmlInfo = पाठक IXmlLineInfo के रूप में उपयोग करें; यह अच्छा कोड अभ्यास। @shuvra – Shuvra

1

IXmlLineInfo इंटरफ़ेस विस्तार करते हुए, इस बात के लिए प्रलेखन बहुत बुरा है, खुदाई करने से थोड़ा, मैं आपको निम्नलिखित बता सकता हूं:

1) System.Xml.XmlReader अमूर्त है, इसलिए आप कभी भी इसके उदाहरण से निपटने वाले नहीं होंगे, इस तथ्य के साथ कि यह लागू नहीं होता है IXmlLineInfo व्यापक विषय में नहीं है

2 (हालांकि अगर यह किया था, यह है कि अभी थोड़ा आसानी :) सब कुछ होगा)) System.Xml.IXmlLineInfo इंटरफ़ेस दो गुण प्रदान करता है: LineNumber और LinePosition (जो बातें हम के बारे में परवाह कर रहे हैं) , प्लस एक विधि: HasLineInfo() जो, दस्तावेज़ीकरण के अनुसार, आपको सूचित करेगा कि कोई कार्यान्वयन लाइनइनोफ़ो लौटा सकता है या नहीं।

3) System.Xml.XmlReader के दस्तावेज उत्तराधिकारियों में से, हमने:

System.Xml.XmlDictionaryReader - abstract, used by WCF for serialization, no IXmlLineInfo 
System.Xml.XmlNodeReader - used when reading a node, no IXmlLineInfo 
System.Xml.XmlTextReader - used when reading a stream of data, has IXmlLineInfo 
System.Xml.XmlValidatingReader - used when reading a stream of data and validating, has IXmlLineInfo. 

उपरोक्त सूची को देखते हुए, XmlDictionaryReader आंतरिक रूप से उपयोग किया जा रहा है, XmlNodeReader इस्तेमाल किया जा रहा है जब आप उत्तीर्ण कर ली है एक नोड को पढ़ने के लिए (जिसे, पार्स किया गया है, पहले से ही अपने स्रोत दस्तावेज़ से अनचाहे है), XmlTextReader और XmlValidtingReader (जिनमें से दोनों IXmlLineInfo लागू करते हैं), जब आप किसी दस्तावेज़ से पढ़ रहे हों तो इसका उपयोग किया जा रहा है। तो, इसका लंबा और छोटा यह प्रतीत होता है कि यदि आपको स्थिति की जानकारी देने के लिए यह संभव या उपयोगी है, तो ढांचा ऐसा करेगा।

कहा जा रहा है कि, दस्तावेज़ीकरण बहुत हल्का प्रतीत होता है। सिर्फ यह किया, मैं (_xr System.Xml.XmlReader की एक अज्ञात ठोस कार्यान्वयन किया जा रहा है) के साथ कर रही है समाप्त हो गया:, कहा जा रहा है जब मैं वास्तव में इसके बाद के संस्करण कोड चलाने

string position = "(unknown)"; 
    if (_xr != null && typeof(System.Xml.IXmlLineInfo).IsInstanceOfType(_xr) && 
((System.Xml.IXmlLineInfo)_xr).HasLineInfo()) 
    { 
     System.Xml.IXmlLineInfo li = (System.Xml.IXmlLineInfo)_xr; 
     position = "(" + li.LineNumber.ToString() + "," + li.LinePosition.ToString() + ")"; 
    } 
है, उन सभी के साथ

, _xr के प्रकार किया जा रहा समाप्त होता है System.Xml.XsdValidatingReader (उस पर प्रलेखन खोजने के लिए शुभकामनाएं!), जो System.Xml.XmlReader से विरासत में है, लेकिन System.Xml.XmlValidatingReader या System.Xml.XmlTextReader से प्राप्त नहीं है। इस प्रकार, उपरोक्त की तरह एक दृष्टिकोण का उपयोग करना शायद बुद्धिमान है।

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