simplexml编辑CDATA节点

时间:2011-11-09 21:28:46

标签: php xml simplexml cdata

我有一个xml文件, 我想打开它,使用$ _POST输入的值编辑某个CDATA节点并将其保存为同一文件, 我已经阅读了一些在线文档并最终在这里, 请有人建议这样做的好方法......

regardsh

4 个答案:

答案 0 :(得分:1)

SimpleXML默认情况下不会访问CDATA元素。您可以告诉simplexml跳过它们(默认)或阅读它们(参见:read cdata from a rss feed)。如果您阅读它们,它们是标准文本值,因此它们将与其他文本节点合并。

Document Object ModelDocs提供更多控制权,提供DOMCdataSection,其范围从标准文本节点模型DOMText开始。

即使这是一个不同的PHP库(DOM与SimpleXML),两者都是相互兼容的。例如,SimpleXMLElement可以使用dom_import_simplexml函数转换为DOMElement

如果您发布了一些代码到目前为止所做的事情,那么应该很容易弄清楚如何访问要修改的CDATA部分。请提供一些演示XML数据,以便更多地发言。

答案 1 :(得分:1)

由于我最近遇到了同样的问题,我想让人们也看到一些代码,因为链接的示例只能添加新的CDATA部分,但不会删除旧部分。因此,“my”解决方案将从提到的代码示例中合并,并删除旧的CDATA节点。

// get DOM node
$node = dom_import_simplexml($mySimpleXmlElement); 


// remove existing CDATA ($node->childNodes->item(1) does not seem to work)
foreach($node->childNodes as $child) {
  if ($child->nodeType == XML_CDATA_SECTION_NODE) {
    $node->removeChild($child);
  }
}

// add new CDATA
$no = $node->ownerDocument; 
$node->appendChild($no->createCDATASection($myNewContent)); 

// print result
echo $xml->asXML();

答案 2 :(得分:0)

答案 3 :(得分:0)

您可以使用简单函数扩展类SimpleXMLElement来做到这一点

class ExSimpleXMLElement extends SimpleXMLElement {
    /**
     * Add CDATA text in a node
     * @param string $cdata_text The CDATA value  to add
     */
    private function addCData($cdata_text) {
        $node = dom_import_simplexml($this);
        $no = $node->ownerDocument;
        $node->appendChild($no->createCDATASection($cdata_text));
    }

    /**
     * Create a child with CDATA value
     * @param string $name The name of the child element to add.
     * @param string $cdata_text The CDATA value of the child element.
     */
    public function addChildCData($name, $cdata_text) {
        $child = $this->addChild($name);
        $child->addCData($cdata_text);

        return $child;
    }

    /**
     * Modify a value with CDATA value
     * @param string $name The name of the node element to modify.
     * @param string $cdata_text The CDATA value of the node element.
     */
    public function valueChildCData($name, $cdata_text) {

        $name->addCData($cdata_text);

        return $name;
    }
}

用法:

$xml_string = <<<XML
        <root>
            <item id="foo"/>
        </root>
XML;

$xml5 = simplexml_load_string($xml_string, 'ExSimpleXMLElement');
$xml5->valueChildCData($xml5->item, 'mysupertext');
echo $xml5->asXML();

$xml6 = simplexml_load_string($xml_string, 'ExSimpleXMLElement');
$xml6->item->addChildCData('mylittlechild', 'thepunishment');
echo $xml6->asXML();

结果:

<?xml version="1.0"?>
<root>
  <item id="foo"><![CDATA[mysupertext]]></item>
</root>

<?xml version="1.0"?>
<root>
  <item id="foo">
    <mylittlechild><![CDATA[thepunishment]]></mylittlechild>
  </item>
</root>