simplexml编辑CDATA节点

问题描述 投票:1回答:4

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

regardsh

php xml simplexml cdata
4个回答
1
投票

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

Document Object ModelDocs提供更多控制,它提供DOMCdataSection,从标准文本节点模型DOMText延伸。

尽管这是一个不同的PHP库(DOM与SimpleXML),但它们彼此兼容。例如,可以使用SimpleXMLElement函数将DOMElement转换为dom_import_simplexml

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


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();


0
投票

您可以使用simples函数扩展类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>
© www.soinside.com 2019 - 2024. All rights reserved.