通过文件系统从XML解析和删除BOM / Preamble

时间:2019-02-26 08:29:46

标签: c# xml xmlreader byte-order-mark xbrl

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

我从读取的XML文件的开头删除BOM的几次尝试失败。

这是我收到的错误消息:

  

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

最初,我使用的是XDocument.Load(filename),但是由于相同的错误而失败,因此我在从Parsing xml string to an xml document fails if the string begins with <?xml... ?> section获得建议后修改了代码,但没有成功。

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

enter image description here

2 个答案:

答案 0 :(得分:3)

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

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

如果相关文档使用其他扩展ASCII字符,则很有可能也会被破坏。

答案 1 :(得分:2)

序列C3 AF C2 BB C2 BF看起来不像任何BOM

如果它是一致的(在长度上)等,您可能应该调查它是什么。

就这样,您可以简单地跳过前6个字节:

using (var stream = File.Open(fileName, FileMode.Open))
{
    stream.Seek(6, SeekOrigin.Begin);
    var doc = XDocument.Load(stream);
    // ...use it
}