2009-06-08 11 views
12

मैं एक डीबी से प्राप्त मूल्यों के साथ एक्सएमएल दस्तावेज बना रहा हूं। कभी-कभी विरासत कार्यान्वयन के कारण, मैं उस मान को वापस खींचूंगा जिसमें एक char शामिल है जो ठीक से बच नहीं जाता है (उदाहरण के लिए)।सीडीएटीए बनाम एस्केप और वाइस वर्सा कब?

तो प्रश्न बन जाता है, क्या मुझे सीडीएटीए या एस्केप करना चाहिए? क्या कुछ स्थितियां एक बनाम दूसरे के लिए अधिक उपयुक्त हैं?

उदाहरण:

<Email>foo&[email protected]</Email> 

मैं यहाँ CDATA की ओर झुक चाहते हैं।

<Name>Bob & Tom</Name> 

मैं यहां से बचने की ओर झुकता हूं।

मैं हर बार अंधेरे से सीडीएटीए से बचना चाहता हूं, लेकिन एक प्रदर्शन परिप्रेक्ष्य से ऐसा लगता है कि यह तार्किक पसंद है। अमान्य चार की तलाश करने से यह हमेशा तेज़ होगा, और यदि यह मौजूद है तो लपेटें।

विचार?

उत्तर

16

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

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

यदि आपके पास एक एक्सएमएल तत्व है जिसके मूल्य एक्सएमएल है, तो इस मामले के लिए, सीडीएटीए बेहतर विकल्प हो सकता है।

अधिक जानकारी, उदाहरण के एक्सएमएल पूछे जाने वाले प्रश्न के सवाल को देखने के लिए

, When should I use a CDATA Marked Section?

+1

सीडीएटीए बड़े स्ट्रिंग्स के लिए और अधिक नेटवर्क-अनुकूल है जिसे बचने की आवश्यकता है, इसलिए आईएमओ का इस्तेमाल ज्यादातर मामलों में किया जाना चाहिए जहां एक्सएमएल फाइल नेटवर्क पर प्रसारित की जाएगी। –

5

मैंने देखा है लोगों के ऊपर जो ठीक है के लिए CDATA उपयोग करें, और है कि XML नहीं हैं बातें लपेटकर के लिए - जैसे जैसे जेएसओएन या सीएसएस - और इसका उपयोग करने का एक बेहतर कारण है। समस्या तब होती है जब लोग तत्व-आधारित मार्कअप जैसे HTML को उद्धृत करने के लिए इसका उपयोग करते हैं, और फिर भ्रम होता है।

लोग

<![CDATA[<foo>bar</foo>]]> 

जहाँ तक एक्सएमएल सिस्टम में चिंतित हैं

&lt;foo&gt;bar&lt;/foo&gt; 

के समान होने की उम्मीद नहीं है।

बचने के स्तर के डरावने के उदाहरणों के लिए आरएसएस टैग सूप देखें।

आपको यह भी सुनिश्चित करना होगा कि वर्ण अनुक्रम ']]>> आपके लिपटे डेटा में कभी प्रकट नहीं होगा क्योंकि यह टर्मिनेटर है।

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

0

लपेटें: आप doubtfull डेटा है और आप, उन डाटा प्रदर्शन के लिए प्रयोग किया जाता है से बचने के लिए है क्योंकि तब तो वह ऐप्स भी unescape जा रहा है thnking रहे हैं। बार-बार उसी डेटा तत्व से बचें - पार्सिंग & से बचने की अधिक संख्या प्रदर्शन को प्रभावित करेगी।

0

मुझे लगता है कि कोई वास्तविक अंतर नहीं है। मैं सबकुछ के लिए सीडीएटीए का उपयोग करना पसंद करता हूं क्योंकि मुझे बचने के लिए पात्रों की परवाह नहीं है और केवल एक चीज जिसकी मुझे देखभाल करनी चाहिए, "]]>" सामग्री में, यदि आप सीडीएटीए खोलने को विभाजित करते हैं तो बीटीडब्ल्यू को अनुमति दी जाती है और टैग को कई टुकड़ों में बंद करना।

उदाहरण

<?php 

function getXMLContent($content) 
{ 
    if 
    (
     (strpos($content, '<') !== false) || 
     (strpos($content, '>') !== false) || 
     (strpos($content, '&') !== false) || 
     (strpos($content, '"') !== false) || 
     (strpos($content, '\'') !== false) 
    ) 
    { 
     // If value contains ']]>', we need to break it into multiple CDATA tags 
     return "<![CDATA[". str_replace(']]>', ']]]]><![CDATA[>', $content) ."]]>"; 
    } 
    else 
    { 
     // Value does not contain any special characters which needs to be wrapped/encoded/escaped 
     return $content; 
    } 
} 

echo getXMLContent("Hello little world!"); 
echo PHP_EOL . PHP_EOL; 
echo getXMLContent("This <is> a & hard \" test ' for ]]> XML!"); 

?> 

रिटर्न्स (PHP में)

Hello little world! 

<![CDATA[This <is> a & hard " test ' for ]]]]><![CDATA[> XML!]]> 

यदि आप डाल कि इस तरह की एक XML संरचना में:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<test> 
    <![CDATA[This <is> a & hard " test ' for ]]]]><![CDATA[> XML!]]> 
</test> 

... बचाने के यह एक फ़ाइल (जैसे test.xml) और ओपे पर n यह एक ब्राउज़र के साथ, आप देखेंगे कि ब्राउज़र (या किसी अन्य एक्सएमएल आवेदन/पार्सर) आप सही ouput स्ट्रिंग दिखाएगा:

This <is> a & hard " test ' for ]]> XML! 
0

मुझे लगता है कि CDATA तेजी से होगा - इसके लिए स्कैन करने के लिए है अंत चरित्र, शुरुआत से अंत तक एक प्रतिलिपि बनाते हैं और उसे वापस पास करते हैं - एक प्रति। बचने वाले डेटा पढ़ने के साथ, इसे एक बफर का उपयोग करना होगा, इसमें संलग्न होना चाहिए क्योंकि यह बच निकले वर्णों के लिए स्कैन करता है और जब यह समाप्त होता है, तो बफर को स्ट्रिंग में घुमाएं और उसे वापस पास करें। तो, भागने से अधिक मेमोरी का उपयोग होगा और एक अतिरिक्त प्रतिलिपि करना होगा। हालांकि आप शायद डेटा के बड़े सेट और लेनदेन की उच्च संख्या में अंतर देखेंगे। तो यदि इसके छोटे क्षेत्र, इसके बारे में चिंता न करें - या तो उपयोग करें।

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