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

问题描述 投票:0回答:2

我正在处理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

c# xml xmlreader byte-order-mark xbrl
2个回答
3
投票

C3 AF C2 BB C2 BF看起来是一个双UTF-8编码的BOM。 BOM的UTF-8编码是EF BB BF。如果您将每个作为单独的字符和UTF-8编码处理,您最终会得到您所看到的序列。

所以你的文件坏了。有些东西正在包含一个包含UTF-8 BOM的文档,并将其视为扩展ASCII。如果您无法在源文件中修复文档,我倾向于在文件开头查找特定序列并将其删除(如果存在)。

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


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
}
© www.soinside.com 2019 - 2024. All rights reserved.