如何在 XML 中包含未解析的外部实体值?

Xor*_*rax 5 xml include cdata

我在这个例子中有一个 xml 语法错误:

<?xml version="1.0"?>
<!DOCTYPE foo [
    <!ENTITY rules SYSTEM "file://data.txt">
]>
<extract>
    <data>&rules;</data>
</extract>
Run Code Online (Sandbox Code Playgroud)

其中 data.txt 包含:

1    <15024
2    >15023
Run Code Online (Sandbox Code Playgroud)

但当然我有语法错误,因为文本文件( < > )中有 wml 特殊字符。那么如何将这些数据包含为未解析的数据呢?

我希望有这样的结果:

<?xml version="1.0"?>
<extract>
    <data><![CDATA[1    <15024
2    >15023]]></data>
</extract>
Run Code Online (Sandbox Code Playgroud)

Bre*_*mir 2

首先,仅供参考,您指的是外部解析的一般实体,而不是未解析的实体。

尽管您的 data.txt 文件本身不需要格式正确,但在包含时它必须格式正确。由于 CDATA 部分不解析实体(包括外部实体),因此您必须在外部实体文件本身内进行转义(可能通过服务器端处理文件,如果您不能或可以将其引用为外部实体文件)不希望手动进行转义)。

如果您可以控制文件内容并希望手动处理转义,也许您可​​以简单地用文件本身内的 CDATA 块包围每个文件的文本,因为包含时应该是格式良好的。(我还没有尝试或确认,但它似乎应该有效,因为这些实体只需要在包含时格式良好。)

或者,您的另一个选择是转义<&字符(您通常不必转义>,除非讽刺的是,在 CDATA 部分中,以防文本可能包含序列]]>- 所以如果您采用 CDATA 方法,您可以需要解决这种可能性)。(由于外部实体不能在属性中使用,因此您无需担心转义'or ",也没有提到想要这样做。)