使用XDocument.Save()编写XML时如何保留特殊字符?

时间:2010-08-18 13:55:28

标签: c# .net xml

我的源XML的版权字符为©。使用以下代码编写XML时:

var stringWriter = new StringWriter();
segmentDoc.Save(stringWriter);
Console.WriteLine(stringWriter.ToString());

它将版权字符渲染为带有圆圈的小“c”。我想保留原始代码,以便将其作为©吐出来。我怎么能这样做?

更新:我还注意到源声明看起来像<?xml version="1.0" encoding="utf-8"?>,但我保存的输出看起来像<?xml version="1.0" encoding="utf-16"?>。我可以指出我希望输出仍然是utf-8吗?那能解决吗?

Update2:此外,&#x00A0;的输出为ÿ。我绝对不希望发生这种情况!

Update3:&#x00A7;正在成为一个小盒子,这也是错误的。它应该是§

4 个答案:

答案 0 :(得分:3)

我强烈怀疑你无法做到这一点。从根本上说,版权符号 &#x00A9; - 它们是同一事物的不同表示,我希望内存中的表示可以规范化。

之后您在使用XML做什么?处理生成的XML的任何理智的应用程序应该没问题。

如果您使用ASCII显式编码,可能 能够说服它使用实体引用...但我不确定。

编辑:你绝对可以使用不同的编码。您只需要StringWriter报告其“本机”编码为UTF-8。这是一个可以用于此的简单类:

public class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding
    {
         get { return Encoding.UTF8; }
    }
}

您可以尝试将其更改为使用Encoding.ASCII,并查看其对版权符号的作用......

答案 1 :(得分:1)

以这种方式保存一些立陶宛字符时遇到了同样的问题。我找到了一种方法来欺骗这种方法,将&替换为&amp;&amp;#x00A9;以写&#x00A9;等等)它看起来很奇怪,但它对我有用:)

答案 2 :(得分:0)

也许您可以尝试不同的文档编码,请查看: http://www.sagehill.net/docbookxsl/CharEncoding.html

答案 3 :(得分:0)

似乎UTF8无法解决问题。以下内容与您的代码具有相同的症状:

MemoryStream ms = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(ms, new UTF8Encoding());
segmentDoc.Save(writer);
ms.Seek(0L, SeekOrigin.Begin);
var reader = new StreamReader(ms);
var result = reader.ReadToEnd();
Console.WriteLine(result);

我尝试使用相同的ASCII方法,但最后用?代替©。

我认为在将XML转换为字符串后使用字符串替换是获得所需效果的最佳选择。当然,如果你不仅仅对@copy感兴趣,这可能很麻烦;符号

result = result.Replace("©", "\u0026#x00A9;");