为什么XDeclaration会忽略我设置的编码参数

本文关键字:设置 编码 参数 XDeclaration 为什么 | 更新日期: 2023-09-27 18:30:12

问题

我正在尝试用XDeclaration生成一个XML文件,该文件将产生以下

CCD_ 2。

当我运行我的代码时,我一直得到的是这个

<?xml version="1.0" encoding="utf-8"?>

所以问题是,无论我对XDeclaration的编码参数做了什么更改,它都会不断地向我的声明添加一个编码标记。

我的问题

我想要的是可能的吗?如果是的话,有人能向我解释一下吗?

我尝试过的

首先,我尝试将OmitXmlDeclaration设置为true。但这完全删除了我的声明,然后我就不能使用XDeclation类了。。

其次,当我将XDeclation设置为:

new XDeclaration("1.0", string.Empty, "yes")

我得到这个

<?xml version="1.0" encoding="utf-8" standalone="yes"?>

当我将XDeclation设置为:

new XDeclaration("1.0", string.Empty, string.Empty)

我得到这个

<?xml version="1.0" encoding="utf-8"?>

所以我知道它确实对我输入的内容有响应,但编码部分没有。编辑:我还尝试将参数设置为null,而不是string.Empty。这也不起作用。

我的代码

   public FileResult Download() 
      {
            var doc = new XDocument(
                        new XDeclaration("1.0", string.Empty, string.Empty),
                        new XElement("foo", 
                            new XAttribute("hello", "world")
                        )
                    );
            using (var stream = new MemoryStream())
            {
                var settings = new XmlWriterSettings()
                {
                    OmitXmlDeclaration = false,
                    Indent = true,
                };
                using (var writer = XmlWriter.Create(stream, settings))
                {
                    doc.Save(writer);                    
                }
                stream.Position = 0;
                return File(stream.ToArray(), "text/xml", "HelloWorld.xml");
            }      
      }

编辑

De solution是@HimBromBeere给我的。他给出了一个包含以下链接的答案。

cookcomputing.com/blog/archives/00577.html。在这里您可以覆盖编码参数。这对我很有效。

为什么XDeclaration会忽略我设置的编码参数

默认情况下,XML保存方法将在保存Xdocument时覆盖我们通过XDeclaration提供的编码方法。最简单的方法是创建一个内存流并修补编码方法。参考以下代码片段

public static void PatchEncoding(string xmlPath,  XDocument xmlDoc, string encoding = "windows-1251")
{
        using (var stream = new MemoryStream())
        using (XmlTextWriter xmlwriter = new XmlTextWriter(stream, Encoding.GetEncoding(encoding)))
        {
            xmlDoc.Save(xmlPath);
        }
}