通过文件系统从 XML 中解析和删除 BOM/Preamble
Parsing and removing BOM/Preamble from XML via filesystem
我正在处理 XBRL 文件,并将 运行 处理成一堆开头有 Byte-Order-Mark (BOM) 的文件。如果我手动删除它,我可以毫无问题地处理该文件。
我曾多次尝试从我正在读取的 XML 文件的开头删除 BOM。
这是我收到的错误消息:
Data at the root level is invalid. Line 1, position 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\toprocess08\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
序列 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
}
C3 AF C2 BB C2 BF
看起来是双 UTF-8 编码的 BOM。 BOM的UTF-8编码为EF BB BF
。如果您将这些中的每一个都视为一个单独的字符和 UTF-8 编码,您最终会得到您所看到的序列。
所以你的文件坏了。有些东西正在获取包含 UTF-8 BOM 的文档并将其视为扩展的 ASCII。如果您无法在源头修复文档,我倾向于在文件开头查找该特定序列,如果存在则将其删除。
如果有问题的文档使用其他扩展的 ASCII 字符,它们很可能也会被破坏。
我正在处理 XBRL 文件,并将 运行 处理成一堆开头有 Byte-Order-Mark (BOM) 的文件。如果我手动删除它,我可以毫无问题地处理该文件。
我曾多次尝试从我正在读取的 XML 文件的开头删除 BOM。
这是我收到的错误消息:
Data at the root level is invalid. Line 1, position 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\toprocess08\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
序列 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
}
C3 AF C2 BB C2 BF
看起来是双 UTF-8 编码的 BOM。 BOM的UTF-8编码为EF BB BF
。如果您将这些中的每一个都视为一个单独的字符和 UTF-8 编码,您最终会得到您所看到的序列。
所以你的文件坏了。有些东西正在获取包含 UTF-8 BOM 的文档并将其视为扩展的 ASCII。如果您无法在源头修复文档,我倾向于在文件开头查找该特定序列,如果存在则将其删除。
如果有问题的文档使用其他扩展的 ASCII 字符,它们很可能也会被破坏。