使用特定编码保存XML文件,而不在开头行中添加标记

时间:2017-01-04 11:56:45

标签: c# xml unicode encoding utf-8

我一直在编写一个编辑XML文件的程序,但是当我完成它时,我遇到了目标程序无法正确识别XML文件的问题。

我已将问题确定为编码问题,因为XML文件旨在使用Unicode编码的程序,我的Visual Studio会自动以UTF8格式保存。我找到了允许我以Unicode格式保存的答案,但Visual Studio总是在第一行添加编码标签:

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

因此,该程序仍然没有阅读它。如果我手动删除编码部分,它可以工作。我已经搜索了解决方法,但我总是使用UTF 8格式或编码标签。我正在寻找解决方案的代码是:

var doc = new XmlDocument();
doc.Load(@"C:\Chem32\1\Methods\C1C4.M\Agilent\GC78901.RapidControl.MethodXML.xml");

using (StreamWriter output =
new StreamWriter(new FileStream(@"C:\Chem32\1\Methods\C1C4.M\Agilent\GC78901.RapidControl.MethodXML.xml", FileMode.Open), Encoding.Unicode))
{
    XmlWriterSettings settings = new XmlWriterSettings { Encoding = Encoding.Unicode };
      using (XmlWriter xmlWriter =
          XmlWriter.Create(output, settings))
    {
        doc.Save(xmlWriter);
    }
}

1 个答案:

答案 0 :(得分:0)

  

我已将此问题确定为编码问题,因为XML文件旨在使用Unicode编码的程序

通过“Unicode编码”我假设你的意思是微软对UTF-16LE编码的误导性术语。

如果它们以UTF-16LE编码只读取XML字节流的程序是值得的,那么它与XML 1.0规范不符,就像拒绝接受<?xml声明一样。如果您有权访问该程序来修复它,那就太棒了。

  

Visual Studio总是在第一行添加编码标记

您可以将OmitXmlDeclaration添加到XmlWriter设置以避免这种情况。

此外,您可以跳过创建自己的StreamWriter并将Stream直接传递给XmlWriter。这通常是更好的事情,因为它让XmlWriter处理字节编码问题。同样在这种情况下,您也可以跳过流,因为有一个使用文件名的快捷方式。例如

var path = @"C:\Chem32\1\Methods\C1C4.M\Agilent\GC78901.RapidControl.MethodXML.xml";
var settings = new XmlWriterSettings { Encoding=Encoding.Unicode, OmitXmlDeclaration = true };

using (var writer = XmlWriter.Create(path, settings)) {
    doc.Save(writer);
}

ETA:

  

这也删除了标签,目标程序需要此标签

AIEEE!这个疯狂的软件远远不是一个符合标准的XML处理器。如果您真的必须遵循其荒谬的想法,您可以尝试在文档之前自己添加XML声明,例如

var declaration = "<?xml version=\"1.0\"?>\n";
var prolog = Encoding.Unicode.GetBytes(declaration);

using (var stream = new FileStream(path, FileMode.Create, FileAccess.Write)) {
    stream.Write(prolog, 0, prolog.Length);
    using (var writer = XmlWriter.Create(stream, settings)) {
        doc.Save(writer);
    }
}