【问题标题】:XML add content of external element inside CDATAXML 在 CDATA 中添加外部元素的内容
【发布时间】:2019-07-19 07:47:49
【问题描述】:

我有一个传递给 XML 解析器的 XML 文件,我需要从外部资源加载内容,如下所示:

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY data SYSTEM "file:///d:/data.txt" >]>
<component id="200">
  <![CDATA[&data;]]>
</component>

我希望将数据写入 CDATA 标记内,但是,这只是引入了&lt;![CDATA[&amp;data;]]&gt;,并且由于 CDATA 标记被认为是我猜的注释,因此永远不会获取外部资源数据。

数据必须在 CDATA 标记内才能被接受。 如何做到这一点?

谢谢!

【问题讨论】:

  • edit您的问题包括您必须读取/解析XML文档的源代码以及您如何从&lt;component&gt;标签读取数据。还要添加您正在使用的编程语言的语言标签。
  • 由于名为Billion laughs attack 的攻击而扩展实体时要小心。
  • 我无法控制 XML 解析器,它是一个从我那里获取 XML 的 API,并且数据文件位于服务器中我可以上传文件的某个位置。
  • 根据定义,&lt;![CDATA[...]]&gt; 中的所有内容都不会被“解析”。因此,当您编写&lt;![CDATA[&amp;data;]]&gt; 时,您将获得字符串值"&amp;data;"。但由于您提供的是 XML,因此您可以在将数据发送到 API 之前插入数据。
  • 我不能,数据位于API服务器上,只有API服务器可以访问它。它是由各种用户上传的。有没有办法使用 XML 将某些内容包装在 CDATA 标记中?

标签: xml


【解决方案1】:

您的要求似乎自相矛盾。 &lt;![CDATA[ ... ]]&gt; 的全部意义在于括号内的所有内容(]]&gt; 除外)都被视为常规字符数据,而不是标记。如果您想使用像 &amp;data; 这样的实体引用,那很好,但是将它们放在 CDATA 部分是 XML 解析器忽略它们的显式指令。

【讨论】:

    猜你喜欢
    • 2011-01-05
    • 2010-11-17
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多