C# 如何在不转义字符的情况下保存XML?

C# 如何在不转义字符的情况下保存XML?,c#,encode,xmlwriter,C#,Encode,Xmlwriter,在我的C#应用程序中,XML数据可能包含已预处理的任意元素文本,因此(除其他外)非法字符已转换为转义(XML字符实体编码)形式 示例:this&that已转换为this&;那 问题是,当我使用XmlTextWriter保存文件时,“&”被重新转义到this&;amp;那。我不想要那种额外的&在字符串中 另一个示例:•bullet,我的处理将其更改为•;项目符号,保存到• 项目符号。我只想输出到文件中的•;项目符号表单 我在各种XMLWrit

在我的C#应用程序中,XML数据可能包含已预处理的任意元素文本,因此(除其他外)非法字符已转换为转义(XML字符实体编码)形式

示例:
this&that
已转换为
this&;那

问题是,当我使用XmlTextWriter保存文件时,“&”被重新转义到
this&;amp;那
。我不想要那种额外的&在字符串中

另一个示例:
•bullet
,我的处理将其更改为
•;项目符号
,保存到
• 项目符号
。我只想输出到文件中的
•;项目符号
表单

我在各种XMLWriter等上尝试了各种选项,但似乎无法获得正确输出的原始字符串。为什么XML解析器不能识别&而不是重写已经存在的有效转义

更新:在进一步调试之后,我发现元素文本字符串(实际上所有字符串,包括元素标记、名称、属性等)在被System.xml下名为XmlChartType的内部类复制到.net xml对象数据中时都会被编码(CDATA是一个例外)。所以这个问题与XMLWriter无关。解决此问题的最佳方法似乎是在数据输出时取消转义,方法如下:

string output = System.Net.WebUtility.HtmlDecode(xmlDoc.OuterXml);
它可能会演变成一个定制的XmlWriter,以保留格式等


谢谢大家的建议。

请致电xmlwriter.writeraw。但检查字符是否有效还不够聪明。因此,您必须自己检查,否则将生成无效的xml

好的,下面是我提出的解决方案:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Versioning;
using System.Text;

namespace YourName {

    // Represents a writer that makes it possible to pre-process 
    // XML character entity escapes without them being rewritten.
    class XmlRawTextWriter : System.Xml.XmlTextWriter {
        public XmlRawTextWriter(Stream w, Encoding encoding)
            : base(w, encoding) {
        }

        public XmlRawTextWriter(String filename, Encoding encoding)
            : base(filename, encoding) {
        }

        public override void WriteString(string text) {
            base.WriteRaw(text);
        }
    }
}
然后像XmlTextWriter一样使用它:

        XmlRawTextWriter rawWriter = new XmlRawTextWriter(thisFilespec, Encoding.UTF8);
        rawWriter.Formatting = Formatting.Indented;
        rawWriter.Indentation = 1;
        rawWriter.IndentChar = '\t';
        xmlDoc.Save(rawWriter);

无需取消编码或绕过编码功能即可实现此功能。

您能否发布一段您如何使用
XmlTextWriter
?如果您的C#已经创建了一个XML字符串,那么您为什么要使用
XmlTextWriter
?所涉及的代码实际上相当广泛。我使用XmlTextWriter将XML序列化为一个文件。我需要,我可以创建一个复制行为的示例应用程序,但问题必须是众所周知的。如果已经回答了,我会提前道歉,但是我似乎找不到任何相关的东西,除了下载到WriteRaw,这看起来像是一个黑客。只是一个想法,但是
CDATA
块不应该允许这样做吗?是的,这是一个想法-但是在测试您的建议时,我意识到元素文本实际上是在XML树中编码的。我原以为它是在输出上编码的,但显然是在输入或访问上。