在保存()之后在我的 XML 文件的开头获取“” [重复]
Posted
技术标签:
【中文标题】在保存()之后在我的 XML 文件的开头获取“” [重复]【英文标题】:Getting "" at the beginning of my XML File after save() [duplicate] 【发布时间】:2011-06-04 14:28:56 【问题描述】:我正在用 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);
【问题讨论】:
【参考方案1】:是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();
【讨论】:
呵呵,我从来不知道它被劝阻......如果是,那么程序应该如何检测编码? @Lambert:XML 要么在标头中指定编码,要么(缺少)默认为 UTF-8。 @Lambert:for UTF-8 是短语的关键部分。如果您知道它是 utf-8,那么没有意义,没有字节序问题。即使在处理指令中声明了以 utf-16be 编码的 xml 文件而没有 bom 的情况下读取 xml 文件的几率仍然很小。 感谢您的所有回答。这有帮助。我已经用您输入后找到的另一个解决方案更新了这个问题。 此代码无法编译。StreamWriter
的第一个参数是 Stream
,而不是路径。此外,如果doc.Save(sw);
抛出异常,sw
将永远不会关闭。 using
语句的经典案例。【参考方案2】:
这是一个 UTF-8 Byte Order Mark (BOM) 并且是意料之中的。
【讨论】:
【参考方案3】:您可以尝试更改 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);
【讨论】:
【参考方案4】:正如其他人提到的,这是 Unicode 问题。
我建议你试试LINQ To XML。虽然并不真正相关,但我提到它是因为与旧方法相比它超级简单,更重要的是,我认为它可能会自动解决此类问题,而无需您进行额外编码。
【讨论】:
以上是关于在保存()之后在我的 XML 文件的开头获取“” [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 IOS 中保存和加载 XML 文件会在我的 Unity 项目中产生问题