Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XML文档将XML文件从一个位置保存到另一个位置_C#_Xml_Xml Encoding - Fatal编程技术网

C# 使用XML文档将XML文件从一个位置保存到另一个位置

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

将现有XML保存到新位置时,实体从内容中转义并替换为问号

请参见下面的捕捉,实体(-as Hex)在读取时出现,但在保存到其他位置后被问号替换

作为内部XML读取时

作为内部文本阅读时

保存XML文件后

编辑1 下面是我的代码

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的任何方式吗?感谢您在这方面提供的巨大帮助。你能看看这个如何转换ä;至ä;