2012-11-28 2 views
1

내가 XML 문서의 2 개 종류를로드해야합니다; 하나에는 50 명의 하위 하위 항목이 있고 다른 하위 항목에는 동일한 50 및 800 개의 하위 항목이 있습니다. 더 작은 의사에게는 성능이 뛰어나고 어린이 수가 증가 할 때까지 큰 의사에게 허용됩니다. 20k 어린이 * 50 하위 - 위대한 실적, 20k 어린이 * 850 하위 어린이 = 느린 성능. 그들이 존재하지 않을 때 여분의 자손을 찾는 것을 어떻게 건너 뛰겠습니까? 필자의 초기 시도로 인해 크고 작은 문서에 대해 별도의 클래스, 메서드, 뷰 모델 및 뷰가 필요하다고 생각하게되었습니다. 아래는 내 코드를 요약 한 것입니다. 어떻게로드 XML 문서의 속도를 향상시킬 수

public class MyItem 
    { 
     private string layout; 
     private string column; 
     private string columnSpan; 
     private string row; 
     private string rowSpan; 
     private string background; 

public MyItem(string layout, string column, string columnSpan, string row, string rowSpan, string background) 
{ 
     Layout = layout; 
     Column = column; 
     ColumnSpan = columnSpan; 
     Row = row; 
     RowSpan = rowSpan; 
     Background = background; 
} 

public string Layout 
    { 
     get { return this.layout; } 
     set { this.layout = value; } 
    } 

- 그냥이 예를 들어

(표시되지 않음 레이아웃과 동일한 방식으로 처리됩니다 열, ColumnSpan, 행, ROWSPAN 및 배경) 아래 내가 찾고 있어요 단지 6 하위 아이들을 보여줍니다 처음 2 하위 하위 항목 만있는 XML 문서를로드하는 방법입니다. 이렇게하면 작은 또는 큰 xml 문서 모두에서 필요한로드 방법을 사용할 수 있습니다.

internal class myDataSource 
{ 
    //Loads (MyList) xml file 

    public static List<MyItem> Load(string MyListFilename) 
    { 

     var myfiles = XDocument.Load(MylistFilename).Descendants("item").Select(
      x => new MyItem(
       (string)x.Element("layout"), 
       (string)x.Element("column"), 
       (string)x.Element("columnSpan"), 
       (string)x.Element("row"), 
       (string)x.Element("rowSpan"), 
       (string)x.Element("background"))); 

    return myfiles.ToList(); 
    } 

public class MainViewModel : ViewModelBase 
{ 

public void LoadMyList() 
     { 

      this.myfiles = new ObservableCollection<MyItemViewModel>(); 

      List<MyItem> mybaseList = myDataSource.Load(MyListFilename); 

      foreach (MyItem myitem in mybaseList) 
      { 
       this.myfiles.Add(new MyItemViewModel(myitem)); 
      } 


      this.mycollectionView = (ICollectionView)CollectionViewSource.GetDefaultView(myfiles); 
      if (this.mycollectionView == null) 
       throw new NullReferenceException("mycollectionView");     
     } 
} 

public class MyItemViewModel: ViewModelBase 
{ 

    private Models.MyItem myitem; 


    public MyItemViewModel(MyItem myitem) 
    { 
     if (myitem == null) 
      throw new NullReferenceException("myitem"); 

     this.myitem = myitem; 
    }  


    public string Layout 
    { 
     get 
     { 
      return this.myitem.Layout; 
     } 
     set 
     { 
      this.myitem.Layout = value; 
      OnPropertyChanged("Layout"); 
     } 
    } 

- 내가 생각

답변

0

(표시되지 않음 레이아웃과 동일한 방식으로 처리됩니다 열, ColumnSpan, 행, ROWSPAN 및 배경) 당신이 선택에 toList을하지 않습니다 할 수있는 한 가지와 그것을 게으른 것으로 유지하고 대신 Iterable을 반환하거나 Select가 반환하는 모든 것 (미안하지만, 지금 테스트 할 창 상자가 없습니다). 당신은 foreach 문을 수행 할 때, 당신은 당신이 직접 경로 (즉 Elements를 사용)를 따를 수, 대신 Descendants를 사용하는 한 번만 (대신에 두 번 지금) 그 위에

1

를 반복 할 것인가? 이것이 아이템이없는 노드를 스캐닝하는 것을 막을 수있는 유일한 방법입니다.

+0

일을, 당신은 모든 자식 노드를 읽어 메소드를 호출 피하기 위해 아마도 최선을 모든 자식 노드를 읽을 수 없습니다 그것을 원한다면 ... – user7116

+0

모든 자식 노드를 가지고있다 일종의 데이터, 모든 하위 하위가 채워지지는 않습니다. 작은 문서는 개요와 같으며 기본 데이터 만 있습니다. 더 큰 docs 모든 기본적인 자료 플러스 필요로 할 수 있던 그 외 모든 것. 작은 하나는 베어 본 (bare-bones)이고 다른 하나는 매우 풍부한 경험을 제공하지만 둘 다 같은 수의 자식 노드를 가지고 있습니다. –

+0

내가 sixlettervariables 동의, 나는 작은 문서가 큰 문서에 대한 하나 갈하지만 그 MyItem 인수의 작은 숫자를 취하는 구조를 포함하지 않는 말을 나에게 오류를 제공하기위한 다른 방법을 추가했다. 각 문제를 해결하기 시작하면서 모든 것을 두 개 필요로한다는 것을 알게되었습니다. 나는 피하려고합니다. –

0

하여 XDocument은 편리하지만, 문제는 파일이 크고 한 번만를 통해 스캔 할 필요가 단순히 인 경우, XmlReader를 더 나은 선택이 될 수 있습니다. 전체 파일을 읽지 않고 한 번에 하나의 노드 만 읽습니다. 당신은 수동에 관심이없는 부분을 건너 뛸 수 있습니다.

+0

필자의 경우 전체 문서를로드해야 키워드, 인사, 계기 등으로 필터링 할 수 있습니다. –

관련 문제