C# 使用XML文档将XML文件从一个位置保存到另一个位置
将现有XML保存到新位置时,实体从内容中转义并替换为问号 请参见下面的捕捉,实体(-as Hex)在读取时出现,但在保存到其他位置后被问号替换 作为内部XML读取时 作为内部文本阅读时 保存XML文件后 编辑1 下面是我的代码C# 使用XML文档将XML文件从一个位置保存到另一个位置,c#,xml,xml-encoding,C#,Xml,Xml Encoding,将现有XML保存到新位置时,实体从内容中转义并替换为问号 请参见下面的捕捉,实体(-as Hex)在读取时出现,但在保存到其他位置后被问号替换 作为内部XML读取时 作为内部文本阅读时 保存XML文件后 编辑1 下面是我的代码 string path = @"C:\work\myxml.XML"; string pathnew = @"C:\work\myxml_new.XML"; //GetFileEncoding(path); XmlDocument document = new Xm
string path = @"C:\work\myxml.XML";
string pathnew = @"C:\work\myxml_new.XML";
//GetFileEncoding(path);
XmlDocument document = new XmlDocument();
XmlDeclaration xmlDeclaration = document.CreateXmlDeclaration("1.0","US-ASCII",null);
//document.CreateXmlDeclaration("1.0", null, null);
document.Load(path);
string x = document.InnerText;
document.Save(pathnew);
编辑2
我的源文件如下所示。我需要保留实体的现状
这里的问题似乎是由
XmlWriter
实现内部的XmlDocument
处理实体引用的编码
如果您自己创建XmlWriter
,问题就会消失-不受支持的字符将正确编码为实体引用。这个XmlWriter
是一个不同的(更新的)实现,它将字符编码为无法编码字符的实体引用。根据文档中的备注,默认的回退机制是对问号进行编码
var settings = new XmlWriterSettings
{
Indent = true,
Encoding = Encoding.GetEncoding("US-ASCII")
};
using (var writer = XmlWriter.Create(pathnew, settings))
{
document.Save(writer);
}
另外,我建议使用LINQ to XML
XDocument
API进行编译,它比旧的吱吱作响的XmlDocument
API好得多。而且它的Save
版本也没有这个问题 这里的问题似乎是由XmlWriter
实现内部的XmlDocument
处理实体引用的编码
如果您自己创建XmlWriter
,问题就会消失-不受支持的字符将正确编码为实体引用。这个XmlWriter
是一个不同的(更新的)实现,它将字符编码为无法编码字符的实体引用。根据文档中的备注,默认的回退机制是对问号进行编码
var settings = new XmlWriterSettings
{
Indent = true,
Encoding = Encoding.GetEncoding("US-ASCII")
};
using (var writer = XmlWriter.Create(pathnew, settings))
{
document.Save(writer);
}
另外,我建议使用LINQ to XML
XDocument
API进行编译,它比旧的吱吱作响的XmlDocument
API好得多。而且它的Save
版本也没有这个问题 几乎可以肯定这是一个编码问题,但是如果不提供一些代码而不是图片,没有人可以帮助您。如何编写XML?Ascii编码将删除不可打印的字符。因此,您可以使用非unicode(双字节字符)的ascii(单字节字符),这将导致问号。@我很确定您的源文件不是ascii。该字符在ASCII中不存在。用记事本++或其他工具打开文件并检查编码。@这很容易做到,但您需要知道写入文件所需的编码。所以你需要检查它的实际编码。啊,好吧,你最近的编辑更有意义。文件是ASCII编码的,但字符是实体引用。几乎可以肯定这是一个编码问题,但是如果不提供一些代码而不是图片,没有人可以帮助您。如何编写XML?Ascii编码将删除不可打印的字符。因此,您可以使用非unicode(双字节字符)的ascii(单字节字符),这将导致问号。@我很确定您的源文件不是ascii。该字符在ASCII中不存在。用记事本++或其他工具打开文件并检查编码。@这很容易做到,但您需要知道写入文件所需的编码。所以你需要检查它的实际编码。啊,好吧,你最近的编辑更有意义。文件是ASCII编码的,但字符是实体引用。谢谢你的代码。我不知道为什么ö;转换为ö;。应保留为ö;随着我们接近预期产量。非常感谢你的帮助work@Karthick我不认为你能很好地控制实体编码。从语义上讲,它们是完全相同的。是的,当然我在浏览器中看到了,这是在x之后包含00的任何方式吗?感谢您在这方面提供的巨大帮助。你能看看这个如何转换ä;至ä;谢谢你的代码。我不知道为什么ö;转换为ö;。应保留为ö;随着我们接近预期产量。非常感谢你的帮助work@Karthick我不认为你能很好地控制实体编码。从语义上讲,它们是完全相同的。是的,当然我在浏览器中看到了,这是在x之后包含00的任何方式吗?感谢您在这方面提供的巨大帮助。你能看看这个如何转换ä;至ä;