PHP में एक्सएमएल दस्तावेज उत्पन्न करना(बचने वाले पात्र)




xml (7)

मैं एक PHP स्क्रिप्ट से एक एक्सएमएल दस्तावेज उत्पन्न कर रहा हूं और मुझे एक्सएमएल विशेष पात्रों से बचने की जरूरत है। मैं उन पात्रों की सूची जानता हूं जिन्हें बचाना चाहिए; लेकिन ऐसा करने का सही तरीका क्या है?

क्या पात्रों को बैकस्लैश (\ ') से बच जाना चाहिए या उचित तरीका क्या है? क्या कोई अंतर्निहित PHP फ़ंक्शन है जो मेरे लिए इसे संभाल सकता है?


अपने पूरे एक्सएमएल दस्तावेज़ उत्पन्न करने के लिए DOM कक्षाओं का प्रयोग करें। यह एन्कोडिंग और डिकोडिंग को संभालेगा जिसे हम परवाह नहीं करना चाहते हैं।

संपादित करें: @Tchalvak द्वारा इसकी आलोचना की गई थी:

डीओएम ऑब्जेक्ट एक पूर्ण एक्सएमएल दस्तावेज़ बनाता है, यह आसानी से स्वयं को एक स्ट्रिंग एन्कोड करने के लिए खुद को उधार नहीं देता है।

जो गलत है, DOMDocument ठीक से एक टुकड़ा आउटपुट कर सकता है पूरे दस्तावेज़ नहीं:

$doc->saveXML($fragment);

जो देता है:

Test &amp; <b> and encode </b> :)
Test &amp;amp; &lt;b&gt; and encode &lt;/b&gt; :)

जैसे की:

$doc = new DOMDocument();
$fragment = $doc->createDocumentFragment();

// adding XML verbatim:
$xml = "Test &amp; <b> and encode </b> :)\n";
$fragment->appendXML($xml);

// adding text:
$text = $xml;
$fragment->appendChild($doc->createTextNode($text));

// output the result
echo $doc->saveXML($fragment);

Demo देखें


आप इस विधियों का उपयोग कर सकते हैं: http://php.net/manual/en/function.htmlentities.php

इस तरह सभी इकाइयां (एचटीएमएल / एक्सएमएल) बच निकली हैं और आप अपनी स्ट्रिंग को एक्सएमएल टैग के अंदर रख सकते हैं


एक्सएमएल इकाई मुद्दे से निपटने के लिए कड़ी मेहनत की, इस तरह से हल करें:

htmlspecialchars($value, ENT_QUOTES, 'UTF-8')

मैंने सरल फ़ंक्शन बनाया जो एक्सएमएल में मौजूद पांच "पूर्वनिर्धारित इकाइयों" से बचता है:

function xml_entities($string) {
    return strtr(
        $string, 
        array(
            "<" => "&lt;",
            ">" => "&gt;",
            '"' => "&quot;",
            "'" => "&apos;",
            "&" => "&amp;",
        )
    );
}

उपयोग उदाहरण Demo :

$text = "Test &amp; <b> and encode </b> :)";
echo xml_entities($text);

आउटपुट:

Test &amp;amp; &lt;b&gt; and encode &lt;/b&gt; :)

str_replace का उपयोग करके एक समान प्रभाव प्राप्त किया जा सकता है लेकिन यह दोहरी str_replace कारण नाजुक है ( str_replace , अनुशंसित नहीं):

function xml_entities($string) {
    return str_replace(
        array("&",     "<",    ">",    '"',      "'"),
        array("&amp;", "&lt;", "&gt;", "&quot;", "&apos;"), 
        $string
    );
}

सही भागने का सही एक्सएमएल आउटपुट प्राप्त करने का तरीका है, लेकिन आपको विशेषताओं और तत्वों के लिए अलग-अलग भागने की आवश्यकता है। (वह टॉमस का जवाब गलत है)।

मैंने थोड़ी देर पहले कुछ जावा कोड लिखा / चुरा लिया जो विशेषता और तत्व से बचने के बीच अंतर करता है। इसका कारण यह है कि एक्सएमएल पार्सर विशेष रूप से विशेषताओं में सभी सफेद स्पेस विशेष मानता है।

यह बंदरगाह के लिए छोटा होना चाहिए कि PHP से अधिक (आप उपरोक्त उचित भागने के साथ टॉमस जानसिक के दृष्टिकोण का उपयोग कर सकते हैं)। यदि आप UTF-8 का उपयोग करते हैं तो आपको विस्तारित इकाइयों से बचने की चिंता करने की आवश्यकता नहीं है।

यदि आप मेरे जावा कोड को पोर्ट नहीं करना चाहते हैं तो आप XMLWriter को देख सकते हैं जो स्ट्रीम आधारित है और libxml का उपयोग करता है, इसलिए यह बहुत ही कुशल होना चाहिए।


सादेघ के समाधान के आधार पर निम्नलिखित कोड मेरे लिए काम किया:

/**
 * @param $arr1 the single string that shall be masked
 * @return the resulting string with the masked characters
 */
function replace_char($arr1)
{
    if (strpos ($arr1,'&')!== FALSE) { //test if the character appears 
        $arr1=preg_replace('/&/','&amp;', $arr1); // do this first
    }

    // just encode the
    if (strpos ($arr1,'>')!== FALSE) {
        $arr1=preg_replace('/>/','&gt;', $arr1);
    }
    if (strpos ($arr1,'<')!== FALSE) {
        $arr1=preg_replace('/</','&lt;', $arr1);
    }

    if (strpos ($arr1,'"')!== FALSE) {
        $arr1=preg_replace('/"/','&quot;', $arr1);
    }

    if (strpos ($arr1,'\'')!== FALSE) {
        $arr1=preg_replace('/\'/','&apos;', $arr1);
    }

    return $arr1;
}

 function replace_char($arr1)
 {
  $arr[]=preg_replace('>','&gt', $arr1); 
  $arr[]=preg_replace('<','&lt', $arr1);
  $arr[]=preg_replace('"','&quot', $arr1);
  $arr[]=preg_replace('\'','&apos', $arr1);
  $arr[]=preg_replace('&','&amp', $arr1);

  return $arr;
  }       






xml