我一直在编写一个编辑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);
}
}
答案 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);
}
}