c# - 编码 CDATA 元素的有效方法

标签 c# .net xml cdata streamreader

好的,我正在使用 StreamReader 从流中读取数据。流中的数据不是 xml,它可以是任何内容。

基于输入 StreamReader,我使用 XmlTextWriter 写入输出流。基本上,总而言之,输出流包含来自输​​入流的数据,这些数据包装在父元素中包含的元素中。

我的问题是双重的。数据以 block 的形式从输入流中读取,并且 StreamReader 类返回 char[]。如果输入流中的数据包含“]]>”,则需要将其拆分为两个 CDATA 元素。首先,如何在字符数组中搜索“]]>”?其次,因为我正在分块读取,所以“]]>”子字符串可以分为两个 block ,那么我该如何解释这一点?

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

这看起来效率很低,因为它涉及将 char 数组转换为字符串,这意味着花费时间来复制数据,并占用两倍的内存。有没有一种在速度和内存方面都更有效的方法?

最佳答案

根据HOWTO Avoid Being Called a Bozo When Producing XML :

Don’t bother with CDATA sections

XML provides two ways of escaping markup-significant characters: predefined entities and CDATA sections. CDATA sections are only syntactic sugar. The two alternative syntactic constructs have no semantic difference.

CDATA sections are convenient when you are editing XML manually and need to paste a large chunk of text that includes markup-significant characters (eg. code samples). However, when producing XML using a serializer, the serializer takes care of escaping automatically and trying to micromanage the choice of escaping method only opens up possibilities for bugs.
...
Only <, >, & and (in attribute values) " need escaping.

只要对一小组特殊字符进行编码/转义,它就应该可以工作。

是否必须自己处理转义是另一回事,但肯定是一个更容易解决的问题。

然后只需将整个内容作为子文本节点附加到相关的 XML 元素即可。

关于c# - 编码 CDATA 元素的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/544876/

相关文章:

c# - 无法使用 EntityFramework.IBM.DB2 连接到 Informix

c# - 如何在 C# 中编写超快的文件流代码?

c# - 可编辑的word文档附件

c# - 为什么接口(interface)在 IL 级别作为 "abstract interface"发出?

c# - 仅在文件不存在时才创建文件

c# - 在 C# 中处理粘贴事件

c# - LibGit2Sharp 如何解决冲突?

java - 手动更改进度条颜色

PHP DOM : How to get child elements by tag name in an elegant manner?

android - Scrollview 不适用于 Cardview