在save()之后在我的XML文件的开头获得“”

时间:2011-01-06 11:25:53

标签: c# .net xml winforms .net-4.0

我用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);

4 个答案:

答案 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。虽然没有真正相关,但我提到它,因为它比旧的方式更容易,更重要的是,我认为它可能会自动解决这些问题而不需要你的额外编码。