У меня есть этот XML-файл размером 2,8 ГБ (дамп польской Википедии). Я должен искать этот файл для определенного заголовка и получить содержание страницы для него. Я использую LINQ to XML для простоты:
var text = from el in StreamXmlDocument(filePath)
where el.Element("title").Value.Contains(titleToSearch)
select (string)el.Element("revision").Element("text");
и
private IEnumerable<XElement> StreamXmlDocument(string uri)
{
//code made accoring to informations at MSDN website available at URL:
//http://msdn.microsoft.com/en-us/library/system.xml.linq.xnode.readfrom.aspx
using (XmlReader reader = XmlReader.Create(uri))
{
reader.MoveToContent();
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
if (reader.Name == "page")
{
XElement el = XElement.ReadFrom(reader) as XElement;
el.DescendantsAndSelf().Attributes().Where(n => n.IsNamespaceDeclaration).Remove();
if (el != null)
{
yield return el;
}
}
break;
}
}
}
Итак, проблема в том, что этот файл содержит атрибут xmlns в первом элементе:
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" (...) >
и когда я запускаю код выше, я получаю сообщение об ошибке без ссылки на объект в этой строке:
where el.Element("title").Value.Contains(titleToSearch)
Когда я вручную удаляю этот атрибут xmlns, все работает нормально. Я нашел где-то в Интернете, что это:
el.DescendantsAndSelf().Attributes().Where(n => n.IsNamespaceDeclaration).Remove();
должен удалить все атрибуты xmlns из элементов. Но это не так.