在保存()之后在我的 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 应用程序。

有什么想法吗?为什么会这样做?我们可以以某种方式禁用它吗?它是给 Adob​​e 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 文件的开头获取“” [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从文件的开头删除?

通过删除特殊字符改进 Tesseract OCR 结果

在 IOS 中保存和加载 XML 文件会在我的 Unity 项目中产生问题

SVM 分类器没有保存在“.xml”中?

为啥我的 Python 代码在从文本文件中读取时会打印额外的字符“”?

如何从存储在我的 PC 上的文件中获取 XML 数据并使用 javascript 填充 HTML 表格?