我用C#打开一个现有的XML文件,然后我替换那里的一些节点。一切正常。在我保存之后,我在文件的开头得到以下字符:
 (EF BB BF in HEX)
整个第一行:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
该文件的其余部分看起来像普通的XML文件。 简化的代码在这里:
XmlDocument doc = new XmlDocument();
doc.Load(xmlSourceFile);
XmlNode translation = doc.SelectSingleNode("//trans-unit[@id='127']");
translation.InnerText = "testing";
doc.Save(xmlTranslatedFile);
我正在使用.NET 4.0的C#Windows Forms应用程序。
有什么想法吗?为什么会这样做?我们可以以某种方式禁用它吗?它适用于Adobe InCopy,它不会像这样打开它。
更新: 替代解决方案:
使用XmlTextWriter保存它也适用:
XmlTextWriter writer = new XmlTextWriter(inCopyFilename, null);
doc.Save(writer);
答案 0 :(得分:39)
这是UTF-8 BOM,实际上不鼓励使用Unicode标准:
http://www.unicode.org/versions/Unicode5.0.0/ch02.pdf
既不需要也不需要使用BOM 推荐用于UTF-8,但可能是 在UTF-8的上下文中遇到过 数据从其他编码转换而来 使用BOM或BOM的表单 用作UTF-8签名
您可以使用以下方法禁用它:
var sw = new IO.StreamWriter(path, new System.Text.UTF8Encoding(false));
doc.Save(sw);
sw.Close();
答案 1 :(得分:6)
这是一个UTF-8 Byte Order Mark(BOM),是可以预期的。
答案 2 :(得分:0)
您可以尝试更改XmlDocument的编码。以下是从MSDN
复制的示例using System; using System.IO; using System.Xml;
public class Sample {
public static void Main() {
// Create and load the XML document.
XmlDocument doc = new XmlDocument();
string xmlString = "<book><title>Oberon's Legacy</title></book>";
doc.Load(new StringReader(xmlString));
// Create an XML declaration.
XmlDeclaration xmldecl;
xmldecl = doc.CreateXmlDeclaration("1.0",null,null);
xmldecl.Encoding="UTF-16";
xmldecl.Standalone="yes";
// Add the new node to the document.
XmlElement root = doc.DocumentElement;
doc.InsertBefore(xmldecl, root);
// Display the modified XML document
Console.WriteLine(doc.OuterXml);
}
}
答案 3 :(得分:0)
正如其他人提到的那样,这是Unicode问题。
我建议你试试LINQ To XML。虽然没有真正相关,但我提到它,因为它比旧的方式更容易,更重要的是,我认为它可能会自动解决这些问题而不需要你的额外编码。