2009-05-16 7 views
5

के साथ प्रसंस्करण मेरे पास एक फ़ाइल है, जो एक्सएमएल प्रारूप में है (केवल रूट स्टार्ट और एंड टैग, और रूट के बच्चे हैं)। बच्चों के टेक्स्ट तत्वों में एम्परसेंड प्रतीक & होता है। एक्सएमएल में दस्तावेज़ को वैध होने के लिए इस प्रतीक को रखने की अनुमति नहीं है, और जब मैंने जावा में डीओएम एपीआई और एक्सएमएल पार्सर का उपयोग करके फ़ाइल को संसाधित करने का प्रयास किया, तो मुझे पार्सिंग त्रुटियां मिलीं। इसलिए, मैंने & को & के साथ बदल दिया है, और मैंने फ़ाइल को सफलतापूर्वक संसाधित किया: मुझे अलग-अलग सादा पाठ फ़ाइलों में टेक्स्ट तत्वों के मान निकालना पड़ा।एक्सएमएल फाइलों में विशेष पात्र - डीओएम एपीआई

जब मैंने इन नव निर्मित टेक्स्ट फ़ाइलों को खोला, तो मुझे & देखने की उम्मीद थी, लेकिन इसके बजाय & था। ऐसा क्यों है? मैंने टेक्स्ट को बिना किसी एक्सटेंशन के टेक्स्ट टेक्स्ट में संग्रहीत किया है (XML प्रारूप के साथ मेरी मूल फ़ाइल में .xml एक्सटेंशन भी नहीं था), और मेरे पास नई फ़ाइल के टेक्स्ट में केवल & है, इससे कोई फर्क नहीं पड़ता कि मैं फ़ाइल कैसे खोलता हूं: txt या xml फ़ाइल के रूप में (ये मेरे XML संपादक में कुछ विकल्प हैं)। वास्तव में क्या होता है? क्या जावा (?) & से & स्वचालित रूप से परिवर्तित करता है? या कुछ डिफ़ॉल्ट एन्कोडिंग है? खैर, & & के लिए खड़ा है, और मुझे लगता है कि कुछ "अदृश्य" स्वचालित रूपांतरण है, लेकिन मैं उलझन में हूं कि यह कब और कैसे होता है। यहाँ के बाद मैं जावा के साथ मूल फ़ाइल संसाधित जो मैं प्राप्त मेरी मूल फ़ाइल और निकाले फ़ाइल के उदाहरण हैं:

यह XML स्वरूप में मेरे "negative.review" फ़ाइल है:

<review> 
<review_text> 
I will not wear it as it is too big &amp; looks funny on me. 
</review_text> 
</review> 

यह मेरा है निकाले फ़ाइल "negative_1":

I will not wear it as it is too big & looks funny on me. 

मेरे लिए यह रूप में यह (किसी भी रूपांतरण/प्रतिस्थापन कर के बिना) है मूल डेटा के लिए महत्वपूर्ण है, इसलिए मैंने सोचा कि मैं निकाले फ़ाइल "negative_1" परिवर्तित करने की प्रक्रिया करने के लिए है कि वापस &amp; से &। जैसा कि आप देखते हैं, ऐसा लगता है कि मुझे ऐसा करने की ज़रूरत नहीं है। लेकिन मुझे समझ नहीं आता क्यों :(।

अग्रिम धन्यवाद!

+1

बस एक टिप्पणी: "रूट प्रारंभ और अंत टैग, और रूट के बच्चे शामिल हैं"। एक्सएमएल की यह बहुत परिभाषा है (केवल एक मूल तत्व है)। – PhiLho

+0

http://stackoverflow.com/questions/4341145/how-to-deal-with-special-characters-in-urls-inside-xml – sandeepKumar

उत्तर

11

वजह साफ है:। एक्सएमएल फ़ाइल वास्तव में शामिल एक "&" चरित्र

यह सिर्फ अलग ढंग से प्रस्तुत किया जाता है (यानी यह "बच गए"), क्योंकि कोई वास्तविक। जैसा कि आपने देखा है,अपने स्वयं के ब्रेक एक्सएमएल फाइलों पर है। एक्सएमएल 1.0 spec में प्रासंगिक खंड पढ़ें: "2.4 Character Data and Markup"। यह केवल कुछ पंक्तियां है, लेकिन यह इस मुद्दे को काफी अच्छी तरह बताती है।

एक्सएमएल डेटा (!) का प्रतिनिधित्व है। इसे टेक्स्ट फ़ाइल के रूप में न सोचें। उदाहरण:

आप एक XML फ़ाइल में "17 < 20" स्ट्रिंग को स्टोर करना चाहते हैं। प्रारंभ में, आप नहीं कर सकते, क्योंकि "<" उद्घाटन टैग ब्रैकेट के रूप में आरक्षित है।तो यह अवैध होगा:

<xml>17 < 20</xml> 

समाधान: आप चरित्र विशेष/सुरक्षित चरित्र पर भागने को रोजगार, बस फ़ाइल की वैधता बनाए रखने के साधन के लिए:

<xml>17 &lt; 20</xml> 

सभी व्यावहारिक प्रयोजनों के लिए ऊपर टुकड़ा निम्न डेटा (JSON प्रतिनिधित्व में इस समय) शामिल हैं:

{ 
    "xml": "17 < 20" 
} 

यही कारण है कि आप अपनी पोस्ट प्रसंस्करण में वास्तविक "&" देखते हैं। यह उसी तरह से बच निकला था, लेकिन यह है जिसका अर्थ हर समय रहता है।

उपर्युक्त उदाहरण यह भी बताता है कि "&" का विशेष रूप से इलाज क्यों किया जाना चाहिए: यह स्वयं एक्सएमएल से बचने वाली तंत्र का हिस्सा है। यह "&lt;" में एक भागने अनुक्रम की शुरुआत को चिह्नित करता है। इसलिए इसे स्वयं से बच जाना चाहिए ("&amp;" के साथ, जैसा आपने किया है)।

+0

शानदार उत्तर ... सामान्य रूप से! +1 – Cerebrus

2

कोई XML पार्सर परोक्ष संस्थाओं अनुवाद करेगा इस तरह के &amp;, &lt;, &gt;, इसी अक्षरों में, पार्स करने की प्रक्रिया के हिस्से के रूप के रूप में फ़ाइल