在 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&currency=EUR]]></url>
          <price><![CDATA[3.88 EUR]]></price>
          <platform>Uplay</platform>
        </item>
      </channel>
    </rss>

问候

【问题讨论】:

【参考方案1】:

SimpleXML 也是如此。 CDATA 节是一种特殊的文本节点。它们实际上是为了使嵌入式部件对人类更具可读性。 SimpleXML 并不真正处理 XML 节点,因此您必须让它将它们转换为标准文本节点。

如果您有 XML 中的 JS 或 html 片段,如果不转义 &lt; 等特殊字符,则更易于阅读。这就是 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;amp; 之间到底有什么区别? 对于某些使用 DOM 或 SimpleXML API 的调用者来说,在阅读级别上没有区别。他们应该读取与字符串完全相同的数据。区别在于序列化。 CDATA 部分需要较少的转义,因此其中的片段对人类来说更具可读性。这对接收 XML 解析器没有任何影响。这是一个显示差异的小示例:eval.in/740419 如果我点击您的链接,我会收到“内部服务器错误”。所以如果有&amp;amp;&amp;amp; 没有区别? - 链接会起作用还是会被破坏? 如果需要,&amp;amp; 在 XML 中被序列化为 &amp;amp;。在 CDATA 部分内它不是。来自文本节点的&amp;amp; 和来自CDATA 部分的&amp;amp; 都被XML 解析器读取为&amp;amp; 也在浏览器中? - 因为它是一个 URL 链接,我希望它能够正常工作。但如果它也适用于&amp;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]] > 中获取值?

PHP读取XML数据中CDATA内数值

JDOM 如何修改XML文档中的CDATA段数据

如何通过 VB.NET 修改 XML 中的 CData

php 使用CDATA围绕节点值或使用转义HTML构建XML文件

PHP - 使用 simplexml_load_string 解析 XML - 使用 CDATA 获取空值? [复制]