2008-09-23 16 views
18

में "&" के साथ एक्सएमएल पढ़ना मुझे एक खराब लिखित वेब एप्लिकेशन विरासत में मिला है, जिसमें उस त्रुटि में प्रतीत होता है जब डेटाबेस में संग्रहीत एक XML दस्तावेज़ में पढ़ने की कोशिश करता है जिसमें "&" है। उदाहरण के लिए सामग्री के साथ एक टैग होगा: "प्रीपेड & चार्ज"। क्या उस चरित्र को पार्स करने में त्रुटि प्राप्त करने के लिए कुछ गुप्त सरल बात है, या क्या मुझे कुछ याद आ रही है?सी # एक्सएमएल डॉक्यूमेंट ऑब्जेक्ट

संपादित करें: क्या कोई अन्य पात्र हैं जो इस प्रकार की पार्सर त्रुटि का निर्माण नहीं कर पाएंगे?

उत्तर

40

समस्या यह है कि एक्सएमएल अच्छी तरह से गठित नहीं है। उचित रूप से जेनरेट एक्सएमएल इस तरह है कि डेटा की सूची जाएगा:

Prepaid & Charge

मैं पहले की तरह ही इस समस्या को ठीक करने के लिए मिला है, और मैं इस regex के साथ यह किया:

Regex badAmpersand = new Regex("&(?![a-zA-Z]{2,6};|#[0-9]{2,4};)"); 

कम्बाइन कि इस तरह एक स्ट्रिंग निरंतर परिभाषित किया गया है:

const string goodAmpersand = "&"; 

अब तुम सिर्फ कह सकते हैं badAmpersand.Replace(<your input>, goodAmpersand);

नोट है कि एक साधारण String.Replace("&", "&amp;"), काफी अच्छा नहीं है, क्योंकि आप पहले से दिए गए दस्तावेज़ के लिए किसी भी & अक्षरों को सही कूटबद्ध किया जाएगा कि क्या गलत रूप से भी एक ही दस्तावेज़ में दोनों पता नहीं कर सकते हैं, या ।

यहां कैच हैं कि आपको इसे अपने xml दस्तावेज़ पर से पहले अपने पार्सर में लोड करना है, जिसका अर्थ है कि इसके माध्यम से अतिरिक्त पास का मतलब है। इसके अलावा, यह एक सीडीएटीए अनुभाग के अंदर ampersands के लिए जिम्मेदार नहीं है। अंत में, यह केवल एम्पर्सेंड पकड़ता है, अन्य अवैध पात्रों जैसे <। अद्यतन: टिप्पणी के आधार पर, मुझे हेक्स-कोडेड (& #x ...;) इकाइयों के लिए अभिव्यक्ति को अपडेट करने की आवश्यकता है।

कौन से पात्र समस्याएं पैदा कर सकते हैं, वास्तविक नियम थोड़ा जटिल हैं। उदाहरण के लिए, डेटा में कुछ वर्णों की अनुमति है, लेकिन तत्व नाम के पहले अक्षर के रूप में नहीं। और अवैध पात्रों की कोई साधारण सूची नहीं है। इसके बजाए, यूनिकोड के एक बड़े (गैर-संगत) स्वैथ defined as legal है, और इसके बाहर कुछ भी अवैध है।

तो जब यह नीचे आता है, तो आपको कम से कम एक निश्चित मात्रा में अनुपालन और स्थिरता रखने के लिए अपने दस्तावेज़ स्रोत पर भरोसा करना होगा। उदाहरण के लिए, मैंने पाया है कि टैग अक्सर यह सुनिश्चित करने के लिए पर्याप्त स्मार्ट होते हैं कि टैग ठीक से काम करते हैं और < से बचते हैं, भले ही उन्हें पता न हो कि & की अनुमति नहीं है, इसलिए आज आपकी समस्या है। हालांकि, सबसे अच्छा बात स्रोत पर तय करने के लिए होगी।

ओह, और CDATA सुझाव के बारे में एक नोट: मैं का उपयोग करें कि यकीन है कि एक्सएमएल कि मैं बना रहा हूं बनाने के लिए अच्छी तरह से गठित है, लेकिन जब बाहर से मौजूदा एक्सएमएल के साथ काम कर, मैं regex विधि को खोजने आसान।

+0

हेक्स-कोडेड &#x...; चरित्र संदर्भ भी मौजूद हो सकते हैं। मैं आमतौर पर दस्तावेज को पहले पार्स करने का प्रयास करने का सुझाव देता हूं, अगर कोई अच्छी तरह से गठित त्रुटि परिणाम होता है तो फिक्सअप हैक लागू करने का कोई भी प्रयास करें। फिर आप सुनिश्चित कर सकते हैं कि भविष्य में निर्धारित वैध दस्तावेज़ हमेशा ठीक से काम करेंगे। – bobince

2

आप &amp;

साथ & जगह ले सकता है या फिर आप भी CDATA वर्गों उपयोग करने में सक्षम हो सकता है।

+1

विश्व स्तर पर एन्कोडिंग और डेटा में किसी भी * वास्तविक * इकाई संदर्भ खो देंगे। – bobince

4

वेब एप्लिकेशन गलती नहीं है, एक्सएमएल दस्तावेज़ है। एक्सएमएल में एम्पर्सेंड को &amp; के रूप में एन्कोड किया जाना चाहिए। ऐसा करने में विफलता एक वाक्यविन्यास त्रुटि है।

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

+0

तो, आपको लगता है कि मैं खराब आलसी हुह भेजने के लिए अपनी आलसी एकीकरण टीम पर दोष लगा सकता हूं? कुछ मुझे बताता है कि मैं अभी भी इसे अपने पक्ष में ठीक कर दूंगा। :-( –

+0

यदि संभव हो तो, हाँ, स्रोत पर समस्या को ठीक करें। अगर आपको पूरी तरह से एक खराब स्रोत से निपटना होगा जो उनके सिस्टम को ठीक नहीं करेगा, तो डेटाबेस में जाने से पहले इसे ठीक करने का प्रयास करें। – Jim

2

ऐसे कई पात्र हैं जो XML डेटा को बुरी तरह गठित होने की सूचना देंगे।

w3schools से:

चरित्रों "<" और "&" की तरह XML तत्वों में अवैध हैं।

इनपुट के लिए सबसे अच्छा समाधान आप एक्सएमएल-अनुरूप होने पर भरोसा नहीं कर सकते हैं इसे सीडीएटीए टैग में लपेटना है, उदा।

<![CDATA[This is my wonderful & great user text]]> 

<![CDATA[ और ]]> टैग के भीतर सब कुछ पार्सर द्वारा नजरअंदाज कर दिया है।

+0

शायद 'टैग टैग के अलावा सीडीएटीए टैग के भीतर सबकुछ' का स्पष्टीकरण पार्सर द्वारा अनदेखा किया जाता है? – workmad3

+0

काफी कुछ नहीं ..]]> नहीं है। इसका मतलब है कि अगर उसे एक एक्सएमएल भेजा गया है जिसमें सीडीएटीए अनुभाग है, या यहां तक ​​कि बस ए]]> पाठ का हिस्सा, यह टूट जाएगा। – davenpcj

+0

उस के लिए चीयर्स, स्पष्टीकरण के साथ संपादित पोस्ट! – ConroyP

4

अन्य उत्तर सब सही हैं, और मैं उनकी सलाह से सहमत है, लेकिन मेरे लिए सिर्फ एक बात जोड़ते हैं:

कृपया अनुप्रयोगों है कि गैर अच्छी तरह से गठित XML के साथ काम नहीं करते हैं, यह सिर्फ के बाकी बनाता है हमारे जीवन और अधिक कठिन :)।

माना जाता है कि ऐसे समय होते हैं जब आपके पास वास्तव में कोई विकल्प नहीं होता है यदि आपके पास दूसरे छोर पर कोई नियंत्रण नहीं है, लेकिन आपको वास्तव में घातक त्रुटि फेंकना चाहिए और जो कुछ टूटा हुआ है उसके बारे में स्पष्ट रूप से और स्पष्ट रूप से शिकायत करना चाहिए ऐसा एक घटना होती है।

आप शायद इसे एक कदम आगे ले जा सकते हैं और कह सकते हैं "एक! यह एक्सएमएल इन स्थानों में टूट गया है और इन कारणों से, यहां मैंने इसे अच्छी तरह से बनाने के लिए इसे ठीक करने का प्रयास किया है: ..."।

मैं एमएसएक्सएमएल एपीआई से अत्यधिक परिचित नहीं हूं, लेकिन सबसे अच्छे एक्सएमएल पार्सर्स आपको त्रुटि हैंडलर इंस्टॉल करने की अनुमति देंगे ताकि आप सटीक लाइन/कॉलम नंबर को जा सकें जहां त्रुटि कोड और संदेश प्राप्त करने के साथ त्रुटियां दिखाई दे रही हैं ।

+0

मैं सहमत हूं। मेरा पहला कार्यवाही शिकायत कर रही है और मैं देखता हूं कि वे इसे ठीक करेंगे या नहीं। समस्या यह है कि यह मेरे लिए 2 मिनट का तय है अंत और बहुत मो अपने अंत में फिर से। किसी भी घटना में सलाह के लिए धन्यवाद। –

+0

+1। यदि आप इसे ठीक करते हैं, कम से कम चेतावनियां बढ़ाने के लिए जारी रखें। इसे 'गलत तरीका' करना जारी रखें और आप निश्चित रूप से उस डेटा को पूरा करेंगे जो इसे ठीक करने के लिए आप जो भी कर रहे हैं उसे तोड़ देता है। – bobince

3

आपके डेटाबेस में XML दस्तावेज़ नहीं हैं। इसमें कुछ अच्छी तरह से गठित XML दस्तावेज़ और कुछ तार हैं जो मानव के लिए XML की तरह दिखते हैं।

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

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