2011-06-07 13 views
45

मेरे पास xml फ़ाइल बनाने और अद्यतन करने के लिए यह कोड है:SimpleXmlElement का उपयोग कर सीडीएटीए कैसे लिखें?

<?php 
$xmlFile = 'config.xml'; 
$xml  = new SimpleXmlElement('<site/>'); 
$xml->title = 'Site Title'; 
$xml->title->addAttribute('lang', 'en'); 
$xml->saveXML($xmlFile); 
?> 

यह निम्न xml फ़ाइल उत्पन्न करता है:

<?xml version="1.0"?> 
<site> 
    <title lang="en">Site Title</title> 
</site> 

सवाल यह है: क्या इस विधि/तकनीक के साथ सीडीएटीए जोड़ने का कोई तरीका है नीचे एक्सएमएल कोड बनाओ?

<?xml version="1.0"?> 
<site> 
    <title lang="en"><![CDATA[Site Title]]></title> 
</site> 
+2

ऐसा नहीं लगता है कि SimpleXML सीडीएटीए नोड्स के निर्माण का समर्थन करता है। कोशिश करें [DOM] (http://php.net/manual/en/book.dom.php) इसके बजाय – Phil

+1

आपको परवाह क्यों है? ' साइट शीर्षक' और '<! [सीडीएटीए [साइट शीर्षक]]> 'समान हैं, सिवाय इसके कि कोई अधिक बाइट्स का उपयोग करता है और इसे पढ़ने के लिए कठिन होता है मानव। – Quentin

+0

@ क्वांटिन अच्छा बिंदु। बस एक ग्राहक की आवश्यकता है। – quantme

उत्तर

80

समझ गया! मैं this great solution से कोड अनुकूलित:

<?php 
// http://coffeerings.posterous.com/php-simplexml-and-cdata 
class SimpleXMLExtended extends SimpleXMLElement { 
    public function addCData($cdata_text) { 
    $node = dom_import_simplexml($this); 
    $no = $node->ownerDocument; 
    $node->appendChild($no->createCDATASection($cdata_text)); 
    } 
} 

$xmlFile = 'config.xml'; 
// instead of $xml = new SimpleXMLElement('<site/>'); 
$xml  = new SimpleXMLExtended('<site/>'); 
$xml->title = NULL; // VERY IMPORTANT! We need a node where to append 
$xml->title->addCData('Site Title'); 
$xml->title->addAttribute('lang', 'en'); 
$xml->saveXML($xmlFile); 
?> 

एक्सएमएल फ़ाइल उत्पन्न:

<?xml version="1.0"?> 
<site> 
    <title lang="en"><![CDATA[Site Title]]></title> 
</site> 

धन्यवाद Petah

+6

http://www.posterous.com/ अब उपलब्ध नहीं है। सौभाग्य से आप यहां पोस्ट किया! – Rober

+3

'सार्वजनिक फ़ंक्शन addChildcdata ($ element_name, $ cdata) {$ this -> $ element_name = NULL; ;> $ Element_name-> addCData ($ cdata) - इस $ } 'विस्तारित वर्ग में यह फ़ंक्शन जोड़ा गया है जिससे आप सीधे सीडीएटा जोड़ सकें। – user151841

+0

मैं बस अपना 2 सी जोड़ सकता हूं कि जब आप इसे 'simplexml_load_file/string()' फ़ाइल लोड करते हैं तो आप इसे "LIBXML_NOCDATA" विकल्प के साथ आसानी से आपूर्ति कर सकते हैं? http://php.net/manual/en/libxml.constants.php – ReSpawN

23

यहाँ इस वर्ग के लिए एक त्वरित addChildWithCDATA विधि है, your answer के आधार पर की मेरी संस्करण है:

Class SimpleXMLElementExtended extends SimpleXMLElement { 

    /** 
    * Adds a child with $value inside CDATA 
    * @param unknown $name 
    * @param unknown $value 
    */ 
    public function addChildWithCDATA($name, $value = NULL) { 
    $new_child = $this->addChild($name); 

    if ($new_child !== NULL) { 
     $node = dom_import_simplexml($new_child); 
     $no = $node->ownerDocument; 
     $node->appendChild($no->createCDATASection($value)); 
    } 

    return $new_child; 
    } 
} 

बस उपयोग करें ऐसे ही टी:

$node = new SimpleXMLElementExtended(); 
$node->addChildWithCDATA('title', 'Text that can contain any unsafe XML charachters like & and <>'); 
9

आप भी इस के लिए एक सहायक समारोह बना सकते हैं, यदि आप बल्कि SimpleXMLElement का विस्तार नहीं चाहते हैं:

/** 
    * Adds a CDATA property to an XML document. 
    * 
    * @param string $name 
    * Name of property that should contain CDATA. 
    * @param string $value 
    * Value that should be inserted into a CDATA child. 
    * @param object $parent 
    * Element that the CDATA child should be attached too. 
    */ 
$add_cdata = function($name, $value, &$parent) { 
    $child = $parent->addChild($name); 

    if ($child !== NULL) { 
    $child_node = dom_import_simplexml($child); 
    $child_owner = $child_node->ownerDocument; 
    $child_node->appendChild($child_owner->createCDATASection($value)); 
    } 

    return $child; 
}; 
2
class MySimpleXMLElement extends SimpleXMLElement{ 

     public function addChildWithCData($name , $value) { 
      $new = parent::addChild($name); 
      $base = dom_import_simplexml($new); 
      $docOwner = $base->ownerDocument; 
      $base->appendChild($docOwner->createCDATASection($value)); 
     } 

    } 

     $simpleXmlElemntObj = new MySimpleXMLElement('<site/>'); 

     /* USAGE */ 

     /* Standard */ 
     $simpleXmlElemntObj->addChild('Postcode','1111'); 

     /* With CDATA */ 
     $simpleXmlElemntObj->addChildWithCData('State','Processing'); 


    /* RESULT */ 
    /* 
    <?xml version="1.0"?> 
    <site> 
     <Postcode>1111</Postcode> 
     <State><![CDATA[Processing]]></State> 
    </site> 
    */ 
0

यहाँ CDATA के साथ बच्चे को जोड़ने के साथ मेरी संयुक्त समाधान है या नोड में सीडीएटीए जोड़ना।

class SimpleXMLElementExtended extends SimpleXMLElement 
{ 
    /** 
    * Add value as CData to a given XML node 
    * 
    * @param SimpleXMLElement $node SimpleXMLElement object representing the child XML node 
    * @param string $value A text to add as CData 
    * @return void 
    */ 
    private function addCDataToNode(SimpleXMLElement $node, $value = '') 
    { 
     if ($domElement = dom_import_simplexml($node)) 
     { 
      $domOwner = $domElement->ownerDocument; 
      $domElement->appendChild($domOwner->createCDATASection("{$value}")); 
     } 
    } 

    /** 
    * Add child node with value as CData 
    * 
    * @param string $name The child XML node name to add 
    * @param string $value A text to add as CData 
    * @return SimpleXMLElement 
    */ 
    public function addChildWithCData($name = '', $value = '') 
    { 
     $newChild = parent::addChild($name); 
     if ($value) $this->addCDataToNode($newChild, "{$value}"); 
     return $newChild; 
    } 

    /** 
    * Add value as CData to the current XML node 
    * 
    * @param string $value A text to add as CData 
    * @return void 
    */ 
    public function addCData($value = '') 
    { 
     $this->addCDataToNode($this, "{$value}"); 
    } 
} 

// Usage example: 

$xml_doc = '<?xml version="1.0" encoding="utf-8"?> 
<offers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1"> 
</offers>'; 

$xml = new SimpleXMLElementExtended($xml_doc); 

$offer = $xml->addChild('o'); 
$offer->addAttribute('id', $product->product_id); 
$offer->addAttribute('url', 'some url'); 

$cat = $offer->addChildWithCData('cat', 'Category description as CDATA'); 

// or 

$cat = $offer->addChild('cat'); 
$cat->addCData('Category description as CDATA'); 
संबंधित मुद्दे