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

时间:2012-07-08 19:06:33

标签: xml include cdata

我在这个例子中遇到了xml语法错误:

<?xml version="1.0"?>
<!DOCTYPE foo [
    <!ENTITY rules SYSTEM "file://data.txt">
]>
<extract>
    <data>&rules;</data>
</extract>

其中data.txt包含:

1    <15024
2    >15023

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

我希望得到类似这样的结果:

<?xml version="1.0"?>
<extract>
    <data><![CDATA[1    <15024
2    >15023]]></data>
</extract>

1 个答案:

答案 0 :(得分:2)

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

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

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

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