2012-11-28 38 views
1

我需要加载2种类型的xml文档;一个拥有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,行,行跨度和背景它的处理方式相同布局)

只是在这个例子中,下面显示只有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"); 
     } 
    } 

(未显示 - 列,ColumnSpan,行,行跨度和背景它的处理方式相同布局)

回答

0

我认为有一两件事你可以做的不是做选择一个toList和保持它为懒惰,并返回一个Iterable,或任何选择返回(对不起,我现在没有一个窗口框来测试它)。当你这样做时,你只会迭代它一次(而不是现在的两次)

1

而不是使用Descendants,你可以按照直接路径(即使用Elements)?这是你扫描节点,你知道没有物品的唯一方法。

+0

+1,如果您不想读取所有子节点,最好避免调用读取每个子节点的方法... – user7116

+0

每个子节点都有某种数据,只是不是所有的子子女都有人居住。较小的文档就像一个大纲,只有基本的数据。更大的文档包含所有基本数据以及可能需要的所有其他内容。小的一个是裸骨,另一个提供非常丰富的体验,但都有相同数量的子节点。 –

+0

我同意sixlettervariables,我添加了另一种小文档去大文档的方法,但是这给了我一个错误,说MyItem不包含一个构造,需要少量的参数。当我开始处理每个问题时,很明显我需要两件事 - 我试图避免。 –

0

XDocument非常方便,但如果问题只是文件很大而且只需要扫描一次,那么XmlReader可能是更好的选择。它不读取整个文件,它一次读取一个节点。您可以手动跳过您不感兴趣的部分。

+0

就我而言,我需要加载整个文档,以便可以按关键字,人员,场合等进行过滤。 –