2010-02-12 53 views

回答

8

是的,您可以將XmlReader與method XNode.ReadFrom結合使用,請參閱文檔中的示例,該文檔使用C#將XmlReader找到的節點選擇性地處理爲XElement。

+0

輝煌。我正在開發一個將處理多個200M XML文件的應用程序,而XDocument正在殺死我。這已經取得了巨大的進步。謝謝。 – 2010-04-21 19:57:04

+4

我想''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

+0

我最近的評論也不完全正確;現在就爲自己工作... – 2013-08-16 20:28:16

0

只要記住,你將不得不依次閱讀文件,指的是兄弟姐妹或後代在最壞的情況下會變得緩慢而不可能。否則@MartinHonnn有關鍵。

+0

這個答案應該被刪除並作爲註釋添加。 – 2017-11-22 15:26:52

5

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(); 
       } 
      } 
     } 
    } 
相關問題