5

我在这个例子中有一个 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 特殊字符。那么如何将这些数据包含为未解析的数据呢?

我希望有这样的结果:

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

1 回答 1

2

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

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

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

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

于 2012-07-11T01:23:12.473 回答