2010-06-24 21 views
5

में अवैध चरित्र मेरे पास एक प्रोग्राम है जो डेटाबेस से डेटा से एक्सएमएल फाइलें उत्पन्न कर रहा है।एक्सएमएल दस्तावेज़

string dsn = "a db connection string"; 
XmlDocument d = new XmlDocument(); 
using (SqlConnection con = new SqlConnection(dsn)) { 
    con.Open(); 
    string sql = "select id as Id, comment as Comment from Test where ... "; 
    using (SqlCommand cmd = new SqlCommand(sql, con)) { 
     DataSet ds = new DataSet("EXPORT"); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     da.Fill(ds, "Test"); 
     d.LoadXml(ds.GetXml()); 
    } 
} 
d.Save(@"c:\test.xml"); 

जब मैं xml पर एक नजर है फ़ाइल यह अमान्य वर्ण है & # एक्स 1 ए;: शॉर्ट कोड में यह निम्नलिखित करता है

<EXPORT> 
    <Test> 
    <Id>2</Id> 
    <Comment> Keyboard NB&#x1A;5 linked</Comment> 
    </Test> 
</EXPORT> 

यह xml फ़ाइल फ़ायरफ़ॉक्स ब्राउज़र द्वारा खोला नहीं जा सकता अमान्य वर्ण कह ...

इकाई आईएसओ 8859-1 और CP1252 में आरक्षित है और ब्राउज़र द्वारा नहीं रेंडर किया जाना चाहिए है। लेकिन XmlDocument आउटपुट xml क्यों वैध है जिसे वैध के रूप में पार्स नहीं किया जा सकता है - या यह एक वैध xml दस्तावेज़ है जिसे केवल ब्राउज़र द्वारा पार्स नहीं किया जा सकता है या एक्सेल द्वारा आयात किया जा सकता है और ... क्या आरक्षित ' अमान्य वर्ण 'या उन्हें एन्कोडिंग कर रहे हैं कि ब्राउज़र के साथ कोई समस्या नहीं है?

आपकी राय के लिए बहुत-बहुत धन्यवाद और Tipps

+0

मुझे सिस्टम के लिए विभिन्न XML विधियों के साथ एक ही समस्या है। डेटा ऑब्जेक्ट्स। मुझे यकीन नहीं है कि वे और तरीके क्या करेंगे। उनके विकल्प पात्रों को तोड़ना या अपवाद फेंकना है। –

उत्तर

3

में डेटा को लपेटें, सभी वर्ण एक्सएमएल में प्रतिनिधित्व योग्य नहीं हैं।

एक्सएमएल 1.0 में, 0x20 से कम मान वाले पात्रों में से कोई भी टैब (0x09), एलएफ (0x0A) और सीआर (0x0D) को छोड़कर उपयोग नहीं किया जा सकता है।

एक्सएमएल 1.1 में, एनयूएल (0x00) को छोड़कर बस कुछ भी इस्तेमाल किया जा सकता है।

आप XML 1.1, और प्राप्त कार्यक्रम XML 1.1 (बहुत सी नहीं) का समर्थन करता है का उपयोग करने का विकल्प है, तो आप 0x1A &#26; या &#x1A; के रूप में बच सकते हैं।

CDATA में इसे लपेटना कोई समाधान नहीं है; CDATA मानक & -मेचनवाद से अलग वर्णों के समूहों से बचने के लिए बस एक सुविधा है।

अन्यथा, आपको क्रमबद्ध करने से पहले इसे हटाने की आवश्यकता होगी।

+0

उस पुराने प्रश्न के बहुत देर से जवाब देने के लिए खेद है - मैंने serializing से पहले अक्षर हटा दिया ... Thx –

0

को देखने के लिए इस उत्तर पर एक नज़र डालें, अगर यह मदद करता है:

.NET DataSet.GetXml() - what's the default encoding?

+0

आपके टिप के लिए धन्यवाद, लेकिन स्ट्रिंग जो मैं ds.GetXml() के साथ मिलता हूं आंतरिक रूप से यूनिकोड (utf-16) में है, मुझे लगता है और जब एन्कोडिंग में बदलाव किए बिना टेक्स्टफाइल पर लिखना ठीक है? –

0

मैं लगता है कि आप एक नियंत्रण-जेड (अंत प्रोसेस कर रहे हैं पाठ फ़ाइल का) चरित्र। क्या यह संभव है?

+0

एचएम गूगल ने आईएसओ 885 9 -1 के लिए "आरक्षित अप्रयुक्त" कहा और इसके सुपरसेट सीपी 1252 शायद यह फ़ाइल चिह्न का अंत है ... लेकिन डीबी में सामग्री मेरे लिए ब्लैक बॉक्स है, इसलिए मुझे डीबी में स्वच्छ इनपुट के लिए फ़िल्टर करने की कोई संभावना नहीं है टेबल ... –

1

SQL डेटा से एक्सएमएल बनाने/मैनिप्ल्यूटिंग करते समय मैंने इसे कुछ बार चलाया है।

लेकिन क्यों XmlDocument उत्पादन एक्सएमएल कि वैध के रूप में पार्स नहीं किया जा सकता है - या यह कोई मान्य XML दस्तावेज़ है कि बस ब्राउज़र द्वारा पार्स नहीं किया जा सकता है या आयातित एक्सेल से और इतने पर

XmlDocument नहीं करता है ' आपके द्वारा भेजे जाने वाले डेटा पर कोई सत्यापन नहीं करता है, यह आपको (डेवलपर) छोड़ देता है। यह एक्सएमएल दस्तावेज़ लगभग हर चीज में अमान्य होना चाहिए जो एक्सएमएल का उपयोग करता है (लेकिन मैं इसके बारे में गलत हो सकता हूं ... आप हमेशा इसका परीक्षण कर सकते हैं: पी)

लगभग हर बार जब मैंने इस समस्या को मारा है, तो मैं समाप्त हो गया अपमानजनक XML डेटा को या तो उचित वर्ण (यदि उसके पास है) के साथ बदलना या बस इससे छुटकारा पा रहा है।

तुम भी एक CDATA ब्लॉक के अंदर अपना एक्सएमएल डालने की कोशिश कर सकते हैं, लेकिन यह फाइल एक छोटा सा (यकीन नहीं कितना बड़ा समग्र अपनी फ़ाइल हो जाएगा)

1

इस xml parse error on illegal character

को एक नजर डालें ब्लोट जाएगा निष्कर्ष (जैसा कि मैंने इसे समझा): एक्सएमएल 1.0 के साथ यह मान स्टोर करना असंभव है।

-1

एक्सएमएल इकाइयों से बचने के लिए सुनिश्चित करें, उदाहरण के लिए। & => &amp; अन्यथा, सीडीएटीए http://en.wikipedia.org/wiki/CDATA

+0

एक इकाई के रूप में, '', यह अभी भी अमान्य है। –

+0

दो समस्याएं। 1. एक्सएमएल और एचटीएमएल इकाइयां अलग-अलग चीजें हैं। डिफ़ॉल्ट रूप से एक्सएमएल केवल 5 इकाइयों का समर्थन करता है, बाकी को डीटीडी द्वारा परिभाषित किया जा सकता है।  एक HTML इकाई है, एक एक्सएमएल नहीं है। तो  एक्सएमएल में काम नहीं करेगा, आपको इसे  के रूप में लिखना होगा। समस्या 2. ऊपर दिए गए उत्तर के अनुसार, एक्सएमएल में गैर-प्रिंट करने योग्य वर्णों को सम्मिलित नहीं किया जा सकता है। तो आपको  से & # 21 जैसे कुछ से बचने की आवश्यकता होगी; एक्सएमएल द्वारा इसे पार्स करने से पहले। –

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