Asp.net 按需使用XML格式的数据填充树视图

Asp.net 按需使用XML格式的数据填充树视图,asp.net,xml,treeview,Asp.net,Xml,Treeview,我有一个很大的XML文件(3000多个节点),我想在ASP.NET上的树状视图中表示它。我无法将其数据绑定到XMLDataSource,因为加载TreeView会太慢(我甚至从未等待足够长的时间来看到它完成…) 因此,解决这个问题的方法是只在需要时使用树节点的PopulateOnDemand属性来加载数据。问题是,我想不出一个办法来实现这个 我如何基于节点的ID搜索XMLDocument以获得具有此ID的节点的所有子节点 XML应该是这样的: <document ID=1>

我有一个很大的XML文件(3000多个节点),我想在ASP.NET上的树状视图中表示它。我无法将其数据绑定到XMLDataSource,因为加载TreeView会太慢(我甚至从未等待足够长的时间来看到它完成…)

因此,解决这个问题的方法是只在需要时使用树节点的PopulateOnDemand属性来加载数据。问题是,我想不出一个办法来实现这个

我如何基于节点的ID搜索XMLDocument以获得具有此ID的节点的所有子节点

XML应该是这样的:

<document ID=1>
    <document ID=2>
        <document ID=3>
        </document>
    </document>
    <document ID=4>
    </document>
</document>


没有关于它可以降低多少级别或任何内容的规则…

根据我自己的经验,在ASP.NET树视图中添加3000个节点是一件坏事,因为viewstate会变得异常。。。这意味着它会爆炸,变得越来越大

尝试使用客户端Javascript(例如JQuery)和AJAX请求来加速加载。使用MVC和客户端Javascript也可能是一种选择

根据经验,不要使用MS Ajax更新treeview,它不受支持

对于读取XML,Linq到XML可能是一个快速的选项。你可以找到一个样品

如果必须使用System.Xml,则以下代码将从文档中获取给定id的子项:

  XmlDocument document = new XmlDocument();
  XmlNodeList nodes = document.SelectNodes(string.Format("/descendant-or-self::*[@id = '{0}']/*", id));
  foreach (XmlNode child in nodes) {
    // child contains the child node
  }
当您没有名称空间时,这可以正常工作,否则,它会变得有点混乱

使用Linq到XML整个过程如下所示:

XDocument doc = new XDocument();
XElement root = doc.Root;
IEnumerable<XElement> children = doc.Root
                                    .DescendantsAndSelf()
                                    .Where(x => (string) x.Attribute("id") == id)
                                    .SelectMany(x => x.Elements());
foreach (var child in children) {
   // do something with the child
}
XDocument doc=new XDocument();
XElement根=文档根;
IEnumerable children=doc.Root
.后代和自我()
.Where(x=>(字符串)x.Attribute(“id”)==id)
.SelectMany(x=>x.Elements());
foreach(儿童中的儿童变量){
//对孩子做点什么
}

要查找所需的节点,请递归搜索树,其中节点的起始位置是xmlDoc.DocumentElement

public XmlNode FindNode( XmlNode node, string id ) {
  XmlNode fNode = null;

  if ( node != null ) {
    bool bfind = id == node.Attributes.GetNamedItem( "Id" ).Value; // here is where you put your matching criteia

    if ( bfind  )
      return node;

    XmlNodeList nodeList = node.ChildNodes;
    int length = node.ChildNodes.Count;

    XmlNode childNode = null;
    int index = 0;
    do {
      childNode = nodeList.Item( index++ );
      fNode = FindNode( childNode, Name );
    } while ( childNode != null && fNode == null );
  }
  return fNode;
}

拥有节点后,您可以使用node.NextSibling获得其所有同级节点。谢谢!我将忘记ASP树视图,并基于Javascript创建自己的;-)