在PHP中修改![CDATA []]? (XML)
问题描述:
我有一个包含![CDATA []]数据的XML文件。就像这样:在PHP中修改![CDATA []]? (XML)
<link><![CDATA[https://google.de]]></link>
现在听说我不能修改[CDATA []]数据或他们包含一些特殊的字符!但我不记得了...... 这就是我在这里问的原因。
我可以更改![CDATA []]中的值,如果是,怎么办?
我只想在链接上添加类似“?= dadc”的内容。
编辑: 我的XML文件的结构(要编辑的网址):
<?xml version="1.0" encoding="UTF-8"?>
<rss>
<channel xmlns:g="http://base.google.com/ns/1.0" version="2.0">
<title>Google Eur English 1</title>
<description/>
<item>
<title>Anno 2070</title>
<g:image_link><![CDATA[http://cdn.kinguin.net/media/catalog/category/anno_8.jpg]]></g:image_link>
<url><![CDATA[http://www.kinguin.net/category/4/anno-2070/?nosalesbooster=1&country_store=1¤cy=EUR]]></url>
<price><![CDATA[3.88 EUR]]></price>
<platform>Uplay</platform>
</item>
</channel>
</rss>
问候
答
对于SimpleXML也是如此。 CDATA节是一种特殊的文本节点。它们实际上是为了使嵌入式部件对人类更易读。 SimpleXML并不真正处理XML节点,因此您必须让它将它们转换为标准文本节点。
如果您在XML中有JS或HTML片段,如果特殊字符(如<
)未转义,则更容易阅读。这是CDATA部分的目的(以及对浏览器的一些向后兼容性)。
因此,要修改CDATA节并保留它,您将不得不使用DOM。 DOM实际上知道不同的节点类型。这里是一个小例子:
$xml = '<link><![CDATA[https://google.de]]></link>';
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
foreach ($xpath->evaluate('//link/text()') as $linkValue) {
$linkValue->data .= '?abc';
}
echo $document->saveXml();
输出:其中包含的链接与[CDATA []]
<?xml version="1.0"?>
<link><![CDATA[https://google.de?abc]]></link>
答
幸运的是的!检查:
$link = simplexml_load_string(
'<link><![CDATA[Hello, world!]]></link>'
);
echo (string)$link;
PHP: How to handle <![CDATA[ with SimpleXMLElement?
Regards, Idir
+0
我怎样才能编辑孔XML文件? – Jan
我试图编辑我的CDATA值只是获取和追加我的东西,但现在我的链接如下所示:https://drive.google.com/file/d/0BzLxINxZFzoveWR3Qi1XelFjM0E/view?usp=sharing 我知道你有正确的版本,我会实现像你一样。但是CDATA和'&'之间究竟有什么区别? – Jan
对于某些使用DOM或SimpleXML API的调用者来说,在阅读水平上没有区别。他们应该读取与字符串完全相同的数据。不同之处在于序列化。 CDATA部分不需要转义,因此它们内部的片段对人类而言更具可读性。接收XML解析器没有区别。这里是一个小例子,显示了不同之处:https://eval.in/740419 – ThW
如果我按照你的链接,我会得到“内部服务器错误”。所以,如果有'&'或''&''没有区别? - 链接将起作用或将被销毁? – Jan