我有這個尺寸爲2.8GB(波蘭語維基百科轉儲)的XML文件。我必須搜索此文件以獲取特定標題並獲取頁面內容。我使用的LINQ to XML的簡單:命名空間阻止解析C#中的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屬性。但事實並非如此。
謝謝,是的,我知道的內存問題,這就是爲什麼我使用的XmlReader。它每次只讀取一個元素到內存:)感謝您的迴應。我現在檢查它 – Ventus 2010-07-23 16:49:32
太棒了!這工作正常。再次感謝:) – Ventus 2010-07-23 16:56:49