我想讀取大型xml文件(100 + M)。由於其大小,我不想使用XElement將其加載到內存中。我正在使用linq-xml查詢來解析和讀取它。如何讀取大型XML文件,而無需將其加載到內存中並使用XElement
這樣做的最佳方法是什麼? XPath或XmlReader與linq-xml/XElement組合的任何示例?
請幫忙。謝謝。
我想讀取大型xml文件(100 + M)。由於其大小,我不想使用XElement將其加載到內存中。我正在使用linq-xml查詢來解析和讀取它。如何讀取大型XML文件,而無需將其加載到內存中並使用XElement
這樣做的最佳方法是什麼? XPath或XmlReader與linq-xml/XElement組合的任何示例?
請幫忙。謝謝。
是的,您可以將XmlReader與method XNode.ReadFrom結合使用,請參閱文檔中的示例,該文檔使用C#將XmlReader找到的節點選擇性地處理爲XElement。
只要記住,你將不得不依次閱讀文件,指的是兄弟姐妹或後代在最壞的情況下會變得緩慢而不可能。否則@MartinHonnn有關鍵。
這個答案應該被刪除並作爲註釋添加。 – 2017-11-22 15:26:52
MSDN文檔的XNode.ReadFrom
方法中的示例代碼如下:
class Program
{
static IEnumerable<XElement> StreamRootChildDoc(string uri)
{
using (XmlReader reader = XmlReader.Create(uri))
{
reader.MoveToContent();
// Parse the file and display each of the nodes.
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
if (reader.Name == "Child")
{
XElement el = XElement.ReadFrom(reader) as XElement;
if (el != null)
yield return el;
}
break;
}
}
}
}
static void Main(string[] args)
{
IEnumerable<string> grandChildData =
from el in StreamRootChildDoc("Source.xml")
where (int)el.Attribute("Key") > 1
select (string)el.Element("GrandChild");
foreach (string str in grandChildData)
Console.WriteLine(str);
}
}
但是我發現,在該實例中StreamRootChildDoc
方法需要如下進行修改:
static IEnumerable<XElement> StreamRootChildDoc(string uri)
{
using (XmlReader reader = XmlReader.Create(uri))
{
reader.MoveToContent();
// Parse the file and display each of the nodes.
while (!reader.EOF)
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "Child")
{
XElement el = XElement.ReadFrom(reader) as XElement;
if (el != null)
yield return el;
}
else
{
reader.Read();
}
}
}
}
輝煌。我正在開發一個將處理多個200M XML文件的應用程序,而XDocument正在殺死我。這已經取得了巨大的進步。謝謝。 – 2010-04-21 19:57:04
我想''XNode.ReadFrom'文檔頁面上的示例代碼中存在一個錯誤。聲明'XElement el = XElement.ReadFrom(reader)as XElement;'應該是'XElement el = new XElement(reader.Name,reader.Value);'而不是。按原樣,每讀取兩個'Child'元素中的第一個元素都會跳過它所讀取的XML文件。 – 2013-08-16 19:54:55
我最近的評論也不完全正確;現在就爲自己工作... – 2013-08-16 20:28:16