首页 > 解决方案 > 通过文件系统从 XML 中解析和删除 BOM/Preamble

问题描述

我正在处理 XBRL 文件,并遇到了一堆在开始时具有字节顺序标记 (BOM) 的文件。如果我手动删除它,我可以毫无问题地处理该文件。

我曾多次尝试从我正在读取的 XML 文件的开头删除 BOM,但都失败了。

这是我收到的错误消息:

根级别的数据无效。第 1 行,位置 1。

最初我正在使用XDocument.Load(filename),但这失败并出现同样的错误,所以我在从Parsing xml string to an x​​ml document 获得建议后修改了代码,如果字符串以 <?xml... ?> 部分开头没有成功。

void Main()
{
    XDocument doc;
    var @filename = @"C:\accounts\toprocess\2008\Prod224_8998_00741575_20080630.xml";
    byte[] file = File.ReadAllBytes(filename);
    using (MemoryStream memory = new MemoryStream(file))
    {
        using (XmlTextReader oReader = new XmlTextReader(memory))
        {
            doc = XDocument.Load(oReader);
        }
    }
}

XML 文件可以在这里找到:http ://s000.tinyupload.com/download.php?file_id=92333278767554773703&t=9233327876755477370347742

在此处输入图像描述

标签: c#xmlxmlreaderbyte-order-markxbrl

解决方案


C3 AF C2 BB C2 BF看起来是双 UTF-8 编码的 BOM。BOM 的 UTF-8 编码是EF BB BF. 如果您将它们中的每一个都视为一个单独的字符并使用 UTF-8 编码,那么您最终会得到您所看到的序列。

因此,您拥有的文件已损坏。某些东西正在获取包含 UTF-8 BOM 的文档并将其视为扩展 ASCII。如果您无法从源头获取文档,我倾向于在文件开头查找该特定序列并在存在时将其剥离。

如果有问题的文档使用其他扩展的 ASCII 字符,它们也很有可能被破坏。


推荐阅读