【发布时间】:2012-03-06 08:29:04
【问题描述】:
在我的 C# 应用程序中,XML 数据可能包含已经过预处理的任意元素文本,因此(除其他外)非法字符已被转换为其转义(xml 字符实体编码)形式。
示例:<myElement>this & that</myElement> 已转换为 <myElement>this &amp; that</myElement>。
问题是当我使用 XmlTextWriter 保存文件时,'&' 被重新转义为<myElement>this &amp;amp; that</myElement>。我不希望字符串中有多余的 &。
另一个例子:<myElement>• bullet</myElement>,我的处理将其更改为<myElement>&#8226; bullet</myElement>,然后保存到<myElement>&amp;#8226; bullet</myElement>。我想要输出到文件的只是<myElement>&#8226; bullet</myElement> 表单。
我在各种 XmlWriters 等上尝试了各种选项,但似乎无法获取原始字符串以正确获取输出。为什么 XML 解析器不能识别和重写已经有效的转义?
更新: 经过更多调试,我发现元素文本字符串(实际上是所有字符串,包括元素标签、名称、属性等)在被复制到 .net xml 对象数据时都会被编码(CDATA 是一个例外)由 System.Xml 下称为 XmlCharType 的内部类。所以这个问题与 XmlWriters 无关。看起来解决问题的最佳方法是在输出数据时取消转义数据,或者使用以下方法:
string output = System.Net.WebUtility.HtmlDecode(xmlDoc.OuterXml);
这可能会演变成自定义 XmlWriter 以保留格式等。
感谢所有有用的建议。
【问题讨论】:
-
你能发布一个关于你如何使用
XmlTextWriter的sn-p吗?如果你的 C# 已经创建了一个 XML 字符串,为什么还要使用XmlTextWriter? -
所涉及的代码实际上有点广泛。我正在使用 XmlTextWriter 将 XML 序列化为文件。我需要,我可以创建一个重现行为的示例应用程序,但问题必须是众所周知的。如果这个问题已经得到解答,请提前道歉,但我似乎找不到任何相关的东西,除了下拉到看起来像黑客的 WriteRaw。
-
只是一个想法,但
CDATA块不应该允许这样做吗?