2009-02-13 27 views
2

好吧,我正在使用StreamReader从流中读取数据。流内的数据不是xml,它可以是任何东西。编码CDATA元素的有效方法

基于输入StreamReader,我正在使用XmlTextWriter写入输出流。基本上,当所有事情都说完之后,输出流包含来自包含在父元素中包含的元素中的输入流的数据。

我的问题是双重的。数据以块的形式从输入流中读取,StreamReader类返回char []。如果输入流中的数据包含“]]>”,它需要跨两个CDATA元素进行拆分。首先,如何在char数组中搜索“]]>”?第二,因为我在阅读块,所以“]]>”子字符串可以分成两个块,所以我该如何解释?

我大概可以将char []转换为字符串,并对其进行搜索替换。这将解决我的第一个问题。在每次读取时,我还可以检查最后一个字符是否为“]”,以便在下一次读取时,如果前两个字符是“]>”,我将启动一个新的CDATA部分。

这似乎很难看,因为它涉及到将字符数组转换为字符串,这意味着要花时间复制数据,并消耗两倍的内存。有没有更高效的方法,既有速度又有记忆力?

+0

我已经删除了我的答案,因为我决定我不知道XmlTextWriter如何工作。文件没有说我预期他们会。 – 2009-02-13 06:13:47

回答

0

秒,因为我在读大块,“]]>”子字符串可以分成两个块,所以我该如何解释?

事实上,您必须将最后两个字符保留在队列中,而不是立即将它们吐出。然后,当新输入进来时,将它追加到队列中,并再次取除除最后两个字符以外的所有字符,搜索并替换它们并输出。

更好:根本不用打扰CDATA部分。他们只是为了方便手工创作。如果您已经在进行搜索和替换,那么没有理由不应该仅仅使用它们的预定义实体搜索并替换'<','>'和'&',并将它们包括在正常的文本节点中。由于这些是简单的单字符替换,因此您不必担心缓冲。但是,如果您正在使用XmlTextWriter,就像为每个传入文本块调用WriteString()一样简单。

4

根据HOWTO Avoid Being Called a Bozo When Producing XML

Don’t bother with CDATA sections

XML提供逃逸 标记,显著字符的方式有两种: 预定义的实体和CDATA 部分。 CDATA部分只有 句法糖。这两个替代 句法结构没有语义 的区别。

CDATA部分是方便,当你 手动编辑XML和需要 贴一大块文本 包括标记,显著字符 (如代码示例)。但是,当 使用串行器产生XML时, 串行器负责自动转义 并尝试到 微操作转义的选择 方法只会为 错误打开可能性。
...
只有<,>,&和(属性值)“需要转义。

只要小集合的特殊字符进行编码/逃脱它应该只是工作。

不管你有处理自己逃跑是另一回事,但肯定是一个更直接求解的问题。

然后,只需追加一大堆的子文本节点相关的XML元素。

+0

这使得它很容易。谢谢。 – 2009-05-26 20:04:30

1

我知道的正好有两个真正的用例CDATA:

一个是含XHTML文档脚本:

<script type="text/javascript"> 
<![CDATA[ 
    function foo() 
    { 
     alert("You don't want <this> text escaped."); 
    } 
]]> 
</script> 

另一种是在文本中包含嵌入标记手工创作的XML文档,例如:

<p> 
    A typical XML element looks like this: 
</p> 
<p> 
    <pre> 
    <![CDATA[ 
     <sample> 
     <text> 
      I'm using CDATA here so that I don't have to manually escape 
      all of the special characters in this example. 
     </text> 
     </sample> 
    ]]> 
    </pre> 
</p> 

在其他情况下,只需让DOM(或XmlWriter的,或任何工具,你用创建XML)逃离文本节点的工作就好了。

+0

避免在脚本周围需要CDATA节的一个好方法是使用JavaScript字符串文字转义:alert(“您不希望\ x3Cthis \ x3E文本转义。”); – bobince 2009-02-24 00:58:42

相关问题