在 PHP 中修改 ![CDATA[]]? (XML)
Posted
技术标签:
【中文标题】在 PHP 中修改 ![CDATA[]]? (XML)【英文标题】:Modify ![CDATA[]] in PHP? (XML) 【发布时间】:2017-07-10 07:47:38 【问题描述】:我有一个包含 ![CDATA[]] 数据的 XML 文件。像这样:
<link><![CDATA[https://google.de]]></link>
现在我听说我不能修改 ![CDATA[]] 数据或者它们包含一些特殊字符。但是我已经不记得了…… 这就是我在这里问的原因。
我可以更改 ![CDATA[]] 中的值吗?如果可以,如何更改?
我只想在链接上附加“?=dadc”之类的内容。
编辑: 我的 XML 文件结构(想编辑 url):
<?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>
问候
【问题讨论】:
【参考方案1】: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();
输出:
<?xml version="1.0"?>
<link><![CDATA[https://google.de?abc]]></link>
【讨论】:
我试图通过获取和附加我的东西来编辑我的 CDATA 值,但现在我的链接看起来像这样:drive.google.com/file/d/0BzLxINxZFzoveWR3Qi1XelFjM0E/… 我知道你有正确的版本,我会像你一样实现它。但是 CDATA 和&amp;
之间到底有什么区别?
对于某些使用 DOM 或 SimpleXML API 的调用者来说,在阅读级别上没有区别。他们应该读取与字符串完全相同的数据。区别在于序列化。 CDATA 部分需要较少的转义,因此其中的片段对人类来说更具可读性。这对接收 XML 解析器没有任何影响。这是一个显示差异的小示例:eval.in/740419
如果我点击您的链接,我会收到“内部服务器错误”。所以如果有&amp;
或&amp;
没有区别? - 链接会起作用还是会被破坏?
如果需要,&amp;
在 XML 中被序列化为 &amp;
。在 CDATA 部分内它不是。来自文本节点的&amp;
和来自CDATA 部分的&amp;
都被XML 解析器读取为&amp;
。
也在浏览器中? - 因为它是一个 URL 链接,我希望它能够正常工作。但如果它也适用于&amp;
,我不需要让我做更多的工作:D【参考方案2】:
幸运的是!请检查:
$link = simplexml_load_string(
'<link><![CDATA[Hello, world!]]></link>'
);
echo (string)$link;
php: How to handle <![CDATA[ with SimpleXMLElement?
问候, 伊迪尔
【讨论】:
我如何编辑包含带有![CDATA[]]链接的洞XML文件?以上是关于在 PHP 中修改 ![CDATA[]]? (XML)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 php DOM 在 <![CDATA[values]] > 中获取值?