我有一个用C#编写的进程,它读取大型XML文件,有些超过1Gb(目前最大的是5Gb)。我们知道从开始就会有大文件,所以我们使用XMLReader而不是使用XMLDocumentReader。过程如下:
var i = from x in StreamRecords(fileName, "Active")
select x;
foreach (var item in newActiveNames)
{
var y = (from j in item.Descendants()) ///etc...
和
private static IEnumerable<XElement> StreamEntities(string fileName, string Type)
{
using (var rdr = XmlReader.Create(fileName))
{
rdr.MoveToContent();
rdr.ReadToDescendant(Type);
while (rdr.Read())
{
if ((rdr.NodeType == XmlNodeType.Element) && (rdr.Name == "Item"))
{
var e = XElement.ReadFrom(rdr) as XElement;
yield return e;
}
}
rdr.Close();
}
}
这为我们提供了文件中所有活动项目(我们也可以使用非活动项目)。
无论如何,我们已经运行了很多文件,而且大多数是盛大的,但是我们发现发送给我们的一些文件没有格式化,并且它们返回正好一半预期的项目。我使用XMLDocumentReader写了相同的代码:
d.Load(fileName);
XmlNodeList list = d.SelectNodes("Active/Items", mgr); //mgr is the namespace manager
和List.Count返回正确的数字(完全是流代码结果的两倍)。
我尝试使用IgnoreWhitespace选项作为答案to this question,但没有运气......任何想法?
[更新]所以,我虽然得到了答案,但似乎我没有...在这方面多一点,因为我现在比昨天更加迷失:
似乎是导致问题的格式不正确的文件。如果我在XML Spy中打开文件,格式化并保存它,我得到正确的结果......我可以回到某些人并要求启用格式化的新转储,但现在我想弄清楚为什么如果格式没有缩进,则XMLReader会出现问题... 非常困惑