XDocument转换成字符串:如何在声明中省略编码

本文关键字:声明 中省 编码 转换 字符串 XDocument | 更新日期: 2023-09-27 18:13:32

我正在为一个过时的企业XML API编写一个包装器。我有一个需要转换为字符串的XDocument。由于他们的XML解析器非常挑剔,它甚至不能处理XML节点之间的空白,所以文档声明必须是EXACTLY:

<?xml version="1.0"?>
但是,XDocument.Save()方法总是在该声明中添加了一个encoding属性:
<?xml version="1.0" encoding="utf-16"?>

在Google和Stack上花了一个小时寻找生成XML字符串的最佳方法,我能做的最好的是:

string result = xmlStringBuilder.ToString().Replace(@"encoding=""utf-16"", string.Empty));

我试过了

xdoc.Declaration = new XDeclaration("1.0", null, null);

在XDocument中成功地按照我想要的方式设置声明;然而,当我调用Save()方法时,无论我走什么路线(使用textwwriter,添加XmlWriterSettings等),编码属性都会神奇地被扔回那里。

有没有人有更好的方法来做到这一点,或者我的代码永远注定要在丑陋的字符串替换上面的注释中有一段咆哮?

XDocument转换成字符串:如何在声明中省略编码

接收端应该固定使用XML解析器,而不是与XML语法打破的东西,但与。net如果你想创建一个字符串与XML声明,因为你张贴它以下方法适用于我:

public class MyStringWriter : StringWriter
{
    public override Encoding Encoding
    {
        get
        {
            return null;
        }
    }
}

    XDocument doc = new XDocument(
        new XDeclaration("1.0", null, null),
        new XElement("root", "test")
        );
    string xml;
    using (StringWriter msw = new MyStringWriter())
    {
        doc.Save(msw);
        xml = msw.ToString();
    }
    Console.WriteLine(xml);

输出
<?xml version="1.0"?>
<root>test</root>