2014-09-14 2 views
2

에 부하가 너무 큰 XML 파일 나는 XML 파일의 URL을 읽기 위해이 코드를 작성 않았다하여 XDocument 수요

XDocument feedXml = XDocument.Load("url address of xml file here"); 
     var feeds = from feed in feedXml.Descendants("List") 
        select new Event { 
         Id = Int32.Parse(feed.Element("ID").Value), 
         Name = feed.Element("Name").Value,        
         City = feed.Element("City").Value        
        }; 
     return feeds; 

내 문제는 파일이 (40메가바이트에 대해) 너무 크고 너무 많은 시간이 걸릴 것입니다 로드합니다. 그래서 XML 파일을 읽으려면 XmlReader를 사용하고 있지만이 방법은 필요에 따라 모든 페이지 (예 : 10)의 레코드를로드하는 방법을 모르기 때문에 전체 파일을 읽고 다른 레코드를 건너 뜁니다 적절한 요소에 도달하기 위해선 안될까요?

string XmlFileUrl = @"url address of xml file here"; 
     using (XmlReader reader = new XmlTextReader(XmlFileUrl)) 
     {  
      bool openItem = false; 
      Event item = new Event(); 

      while (reader.Read()) 
      {      
       if (reader.NodeType == XmlNodeType.Element) 
       { 
        if (reader.Name == "List") 
        { 
         item = new Event(); 
         openItem = true; 
        } 
        else if (reader.Name == "Name" && openItem) 
         item.Name = reader.ReadElementContentAsString(); 
         ... 
       } 
       else if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "List" && openItem) 
       { 
        openItem = false; 
        feeds.Add(item);          
       } 
      } 
     } 

모든 페이지, 또는 어떤 제안에 바로 필요한 데이터를로드하는 페이징과 JSON으로 XML 파일을 JQuery와 아약스를 사용하거나 변환 할 수있는 방법이 있나요?

답변

3

나는 AFAIK가 항상 전체 문서를 즉시로드하기 때문에 XML 구조를 사용하여 달성하기가 쉽지 않으며 어쩌면이 경우 XDocument.Load이 아니라고 생각합니다. URL 대신 overload with the Stream parameter을 사용해보고 그물을 통해 파일의 일부만로드 해보십시오. 아마 당신은 파일의 일부만을 가져 오는 자신의 로더 (XmlDocument?)를 작성하고 불완전한 구조를 혼자서 파싱 할 필요가있을 것입니다.

URI로 제어되는 XML 파일의 일부를 호출 할 수있는 경우 (예 : http://domain/entries?page=10&take=20이 호출은 유효한 XML을 반환 함) 전체 파일에 대한 링크 대신이 URL을 사용하는 옵션이 있습니다. like :

var pagedUri = @"http://domain/entries?page=10&take=20"; 
XDocument feedXml = XDocument.Load(pagedUri); 
var feeds = from feed in feedXml.Descendants("List") 
      select new Event { 
       Id = Int32.Parse(feed.Element("ID").Value), 
       Name = feed.Element("Name").Value, 
       City = feed.Element("City").Value 
      }; 
return feeds; 

비슷한 문제가있는이 SO post을 살펴보십시오.