Заполнить по запросу TreeView с данными в XML - PullRequest
2 голосов
/ 26 февраля 2010

У меня есть большой XML-файл (более 3000 узлов), который я хочу представить в TreeView на ASP.NET. Я не могу привязать его к XMLDataSource, потому что загрузка TreeView будет слишком медленной (я даже не ждал достаточно долго, чтобы увидеть, как он закончится ...)

Таким образом, решение для этого будет использовать свойство PopulateOnDemand TreeNodes для загрузки данных только при необходимости. Проблема в том, что я не могу придумать, как этого добиться ...

Как я могу, основываясь на идентификаторе узла, искать XMLDocument, чтобы получить все дочерние узлы узла, имеющего этот идентификатор?

XML будет выглядеть так:

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

Нет ни правил о том, на сколько уровней он может опуститься, ни о чем ...

Ответы [ 2 ]

2 голосов
/ 26 февраля 2010

Исходя из моего собственного опыта, добавление 3000 узлов в древовидное представление ASP.NET является плохой вещью, так как состояние представления иссякнет ... то есть оно взорвется и станет действительно большим!

Попробуйте что-нибудь с Javascript на стороне клиента (например, с JQuery) и AJAX-запросами для ускорения загрузки. Использование MVC и клиентской части Javascript также может быть вариантом.

Также по опыту не используйте MS Ajax для обновления дерева, оно не поддерживается.

Для чтения XML Linq to XML может быть достаточно быстрым вариантом. Здесь вы можете найти образец для этого.

Если вам нужно использовать System.Xml, то следующий код получает дочерний элемент для данного идентификатора из документа:

  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
}
0 голосов
/ 26 февраля 2010

Чтобы найти нужный узел, рекурсивно ищите дерево, в котором при запуске узла находится 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...