2010-06-08 14 views
16

जब &#x1 के रूप में एक चरित्र संदर्भ में इस तरह के साथ गलत एक्सएमएल पार्स करने का प्रयास, जावा के SAX पार्सर के रूप मेंअमान्य चरित्र संदर्भों को अनदेखा करने के लिए Java SAX पार्सर को कैसे बताना है?

org.xml.sax.SAXParseException: Character reference "&#x1" 
            is an invalid XML character. 

इस तरह के एक गंभीर त्रुटि के साथ एक भयानक मौत मर जाता है वहाँ इस के आसपास कोई तरीका है? एसएक्स पार्सर को सौंपने से पहले मुझे एक्सएमएल फाइल को साफ करना होगा? यदि हां, तो क्या इस बारे में जाने का एक शानदार तरीका है?

उत्तर

20

एक्सएमएल 1.1 का प्रयोग करें! स्काफमैन पूरी तरह से सही है, लेकिन आप अपनी फाइलों के शीर्ष पर <?xml version="1.1"?> चिपक सकते हैं और आप अच्छे आकार में होंगे। यदि आप धाराओं से निपट रहे हैं, तो एक रैपर लिखें जो उस प्रसंस्करण निर्देश को फिर से लिखता या जोड़ता है।

+0

वाह, यह काम करता है। xml 1.1 का उपयोग करने के साथ डाउनसाइड्स या संगतता समस्याएं हैं? – Epaga

+0

http://www.w3.org/TR/xml11/#sec-xml11 पर "एक्सएमएल 1.1 के लिए परिवर्तनों की तर्क और सूची की जांच करें" यदि मैं सही से याद करता हूं, तो कोई वैध xml 1.0 दस्तावेज़ xml 1.1 – wowest

+0

चूंकि यह लोगों के लिए आसान काम करता रहता है, इसलिए इस हेडर को जोड़ने का एक बड़ा शॉर्टकट है: http://docs.oracle.com/javase/1.4.2/docs/api/java/io/PushbackInputStream.html#unread (बाइट []) – wowest

7

आपको अपने एक्सएमएल को साफ करना होगा, मुझे डर है। ऐसे वर्ण एक्सएमएल स्पेक के अनुसार अमान्य हैं, और अन्यथा पार्सर को मनाने के लिए कोई भी प्रेरणा नहीं होगी।

Valid XML characters XML 1.0 के लिए:

  • U+0009
  • U+000A
  • U+000D
  • U+0020 - U+D7FF
  • U+E000-U+FFFD
  • +०१२३९९६०९१६१- U+10FFFF

आदेश को साफ करने के लिए, आप एक अधिक निम्न स्तर के प्रोसेसर, जो इसे एक यूनिकोड चरित्र धारा के रूप में व्यवहार करता है, उन अक्षरों कि अमान्य हैं को दूर करने के माध्यम से डेटा पास करना होगा।

+0

केवल समस्या यह है कि मुझे चरित्र इकाइयों के डीकोडिंग करना होगा ... बमर। – Epaga

2

यह अवैध एक्सएमएल है इसलिए कोई पार्सर बिना त्रुटि के इसे पार्स करना चाहिए।

लेकिन आपको वास्तविक दुनिया में ऐसे हाथ से तैयार किए गए अवैध XML का सामना करना पड़ता है। मेरा समाधान डेटा पर CDATA मार्कर मैन्युअल रूप से डालना है। उदाहरण के लिए,

<data><![CDATA[ garbage with &invalid characters ]]></data> 

बेशक, आप डेटा को वापस मिल जाएगा के रूप में है और आप अमान्य वर्ण अपने आप से निपटने के लिए।

+2

नहीं। अमान्य वर्ण अभी भी सीडीएटीए अनुभागों के अंदर अमान्य हैं। –

+3

कृपया डाउनवोट से पहले तथ्य की जांच करें। सीडीएटीए के अंदर चरित्र संदर्भ नियमित स्ट्रिंग के रूप में माना जाता है। भले ही "& # x1" एक अमान्य संदर्भ का प्रतिनिधित्व करता है लेकिन यह सभी मान्य वर्णों से बना है। मैं हर बार कई पार्सर्स के साथ ऐसा करता हूं इसलिए मुझे पता है कि मैं सही हूं। –

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