2011-07-11 13 views
9

पर सी # के एक्सएमएल रीडर का उपयोग कर मैं एक्सएम फाइलों की एक बड़ी श्रृंखला पर सी # के एक्सएमएल रीडर का उपयोग करने की कोशिश कर रहा हूं, वे कुछ चुनिंदा लोगों को छोड़कर ठीक तरह से स्वरूपित हैं (दुर्भाग्य से मैं उन्हें बदलने की स्थिति में नहीं हूं , क्योंकि यह कई अन्य कोड तोड़ देगा)।थोड़ा विकृत एक्सएमएल

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

<InterestingStuff> 
    ... 
    <ErrorsHere OptionA|Something = "false" OptionB|SomethingElse = "false"/> 
    <OtherInterestingStuff> 
    ... 
    </OtherInterestingStuff> 
</InterestingStuff> 

अगर मैं सिर्फ अवैध टैग को अनदेखा कर सकता है, या पाइप प्रतीक की अनदेखी तो मैं ठीक होगा:

बुरा भागों इस तरह दिखेगा।

XmlReader.Skip() का उपयोग करने का प्रयास करते समय मुझे "ErrorsHere" नाम दिखाई नहीं देता है, जाहिर है कि यह पहले से ही थोड़ा आगे पढ़ता है और अपवाद फेंकता है।

टीएलडीआर: मैं कैसे छोड़ूं ताकि मैं XmlReader का उपयोग कर ऊपर एक्सएमएल फ़ाइल में पढ़ सकूं?

संपादित करें:

कुछ लोग बस की जगह सुझाव दिया '|' -symbol, लेकिन XmlReader का विचार है, पूरी फ़ाइल लेकिन केवल पार भागों आप चाहते हैं लोड नहीं है के बाद से मैं सीधे फ़ाइलों से पढ़ रहा हूँ मैं पूरी फाइलों में पढ़ने का जोखिम नहीं उठा सकता, '|' के सभी उदाहरणों को प्रतिस्थापित करें और फिर भागों को फिर से पढ़ें :)।

+0

प्रतिस्थापित | एक पाठक को लोड करने से पहले साइन इन करें - समस्या को हल कर सकते हैं –

+0

आप XmlReader में जानकारी कैसे पढ़ रहे हैं? क्या आप स्ट्रीम से पढ़ रहे हैं? – Jethro

+3

यदि आप अग्रिम में त्रुटि जानते हैं, तो क्या आप इसे पार्स करने से पहले स्रोत की सामग्री को पैच नहीं कर सकते? लेकिन एक सामान्य तरीके से, आपको स्रोत xml को सही करना चाहिए .... या इसे एक्सएमएल मत कहें (मुझे लगता है कि आप किसी और के आश्रित हैं ...?) –

उत्तर

4

मैंने अतीत में इसका थोड़ा सा प्रयोग किया है।

आम तौर पर इनपुट को अच्छी तरह से गठित किया जाना चाहिए। मूल एक्सएमएल नियम तोड़ने पर एक एक्सएमएल रीडर एक अप्राप्य त्रुटि-स्थिति में जाएगा। स्कीमा-सत्यापन से बचना आसान है लेकिन यह यहां प्रासंगिक नहीं है।

आपका एकमात्र विकल्प इनपुट को साफ करना है, जिसे स्ट्रीमिंग तरीके (कस्टम स्ट्रीम या टेक्स्ट रीडर) में किया जा सकता है लेकिन उसे पार्सिंग के हल्के रूप की आवश्यकता होगी। यदि आपके पास मान्य स्थितियों में पाइप-प्रतीक नहीं हैं तो यह आसान है।

+0

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

1

XmlReader सख्त है। कोई गैर-अनुरूपता, यह त्रुटि होगी।

तो नहीं, आप तब तक ऐसा नहीं कर सकते जब तक कि आप अपना स्वयं का एक्सएमएल कार्यान्वयन नहीं लिखते। विकृत डेटा पर फिक्सअप शायद आसान है।

+0

आसान और अधिक साफ –

1

एक बार मेरे पास एक समान स्थिति थी (HTML फ़ाइलों के साथ, एक्सएमएल फाइल नहीं)। लेकिन मैं विकृत भागों को हटाने के लिए, अपने ऑपरेशन पाइपलाइन में प्रवेश करने से पहले प्रत्येक HTML फ़ाइल के लिए नियमित अभिव्यक्ति का उपयोग कर समाप्त हुआ। यह आसान था और एपीआई के साथ संघर्ष करने से आसान था। :)

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