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