我有一个xml文件,我想打开它,用$ _POST输入的值编辑某些CDATA节点并将其保存为同一个文件,我已经阅读了一些在线文档并最终在这里,有人请建议一个很好的做法这个...
regardsh
SimpleXML
默认情况下不会访问CDATA元素。您可以告诉simplexml跳过它们(默认)或读取它们(请参阅:read cdata from a rss feed)。如果您阅读它们,它们是标准文本值,因此它们与其他文本节点合并。
Document Object ModelDocs提供更多控制,它提供DOMCdataSection
,从标准文本节点模型DOMText
延伸。
尽管这是一个不同的PHP库(DOM与SimpleXML),但它们彼此兼容。例如,可以使用SimpleXMLElement
函数将DOMElement
转换为dom_import_simplexml
。
如果您发布了一些代码到目前为止所做的事情,那么应该很容易弄清楚如何访问要修改的CDATA部分。请提供一些演示XML数据,以便更多地说明。
由于我最近遇到了同样的问题,我想让人们也看到一些代码,因为链接的示例只能添加新的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();
您可以使用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>