Inicio Proyectos Librería NRtfTree Documentación NRtfTree Modelo DOM en NRtfTree Navegación árboles RTF con NRtfTree

Navegación árboles RTF con NRtfTree

por sgoliver

Tras la carga de un documento RTF, NRtfTree permite navegar fácilmente entre los nodos del árbol RTF generado. Para ello, la clase RtfTreeNode ofrece una serie de propiedades que permiten acceder directamente a los nodos adyacentes, tanto por proximidad física como por jerarquía. Y para facilitar la explicación de cada una de las opciones vamos a utilizar el siguiente árbol de ejemplo:

Navegación Árboles RTF

Navegación Árboles RTF

Navegación entre nodos y su árbol RTF asociado

Dado un determinado nodo de un árbol RTF será siempre interesante tener una forma sencilla de obtener una referencia al árbol RTF que lo contiene. Para ello, en NRtfTree vamos a disponer de las propiedades Tree y RootNode, que devuelven respectivamente una referencia al árbol contenedor del nodo actual y al nodo raíz de dicho árbol. Sobre el ejemplo, el nodo raíz de cualquiera de los nodos G o N sería el nodo ROOT.

//Se recupera el árbol contenedor del nodo actual
RtfTree arbol = nodo.Tree;

//Se recupera el nodo raíz del árbol contenedor del nodo actual
RtfTreeNode raiz = nodo.RootNode;

Navegación entre nodo padre y nodos hijos

Como ya comentamos en apartados anteriores, para los grupos rtf NRtfTree crea dependencias jerárquicas de tipo padre-hijo entre el grupo en sí y los elementos que contiene. En la clase RtfTreeNode tendremos disponibles varias propiedades que nos ayudarán a navegar por estas dependencias de forma sencilla.

Así, en primer lugar, para acceder al nodo padre de un determinado nodo se utilizará la propiedad ParentNode. Cuando un nodo no tiene padre la propiedad ParentNode devolvera null. Así, por ejemplo, el nodo padre del nodo N3 sería el nodo G2, y el nodo padre de ROOT sería null.

//Se recupera el nodo padre de un nodo
RtfTreeNode padre = nodo.ParentNode;

Por su parte, para obtener los nodos hijos de un nodo, utilizaremos la propiedad ChildNodes. Esta propiedad devuelve la colección de nodos hijo del nodo actual en forma de objeto de tipo RtfNodeCollection, que a su vez posee las propiedades y métodos tradicionales de las colecciones .NET de tipo lista. De esta forma, para acceder por ejemplo a un nodo hijo determinado puede recuperarse directamente un elemento concreto de esta colección. Sólo los nodos de tipo grupo tendrán inicializada la propiedad ChildNodes, el resto de tipos de nodo la tendrán a null. Como ejemplos, la lista de nodos hijos de G2 sería la formada por los nodos N2 y N3, y la lista de nodos hijos de N1 sería null.

//Se recuperan los nodos hijo del nodo actual
RtfNodeCollection hijos = nodo.ChildNodes;

//Se recupera el 3er nodo hijo del nodo actual
RtfNodeTree tercerHijo = nodo.ChildNodes[2];

Cuando trabajamos con colecciones de nodos es bastante frecuente la necesidad de acceder al primer o último nodo de la lista. Para ello, RtfTreeNode proporciona dos propiedades adicionales para recuperar directamente el primer (FirstChild) y último (LastChild) nodos hijos del nodo actual, algo que sería equivalente a recuperar ChildNodes[0] y ChildNodes[ChildNodes.Count – 1], respectivamente.

//Se recupera el primer nodo hijo del nodo actual
RtfTreeNode primerHijo = nodo.FirstChild;

//Se recupera el último nodo hijo del nodo actual
RtfTreeNode ultimoHijo = nodo.LastChild;

Navegación entre nodos hermanos

NRtfTree también permite navegar entre nodos que comparten el mismo padre. Para ello contamos con las propiedades NextSibling y PreviousSibling, que devuelven respectivamente los nodos hermanos anterior y siguiente del nodo actual. Sobre el ejemplo, el siguiente hermano de N2 sería N3, el siguiente hermano de N1 sería G2, y por su parte el hermano anterior de N5 sería N4 y el hermano anterior de G3 sería G2. En los casos que no exista el hermano anterior o siguiente de un nodo, la propiedad correspondiente devolverá el valor null.Por ejemplo, el hermano siguiente a G3 o a N3 sería null.

//Se recupera el siguiente hermano del nodo actual
RtfTreeNode hermanoSiguiente = nodo.NextSibling;

//Se recupera el hermano anterior del nodo actual
RtfTreeNode hermanoAnterior = nodo.PreviousSibling;

Navegación entre nodos adyacentes

Al igual que podemos navegar entre nodos padre-hijo o entre hermanos, en ciertos procesos también puede ser de utilidad navegar entre nodos que simplemente son adyacentes en el árbol, aunque no exista entre ellos ninguna dependencia jerárquica. Por ejemplo, los nodos N3 y G3 no dependen entre ellos de ninguna forma, pero sin embargo se encuentran juntos físicamente en el árbol RTF y podríamos necesitar recorrerlos de forma secuencial.

Para ello NRtfTree proporciona las propiedades NextNode y PreviousNode, que devuelven respectivamente los nodos siguiente y anterior en el árbol RTF. Obviamente, en muchas ocasiones los valores devueltos por estas propiedades coincidirán con los devueltos por NextSibling y PreviousSibling, aunque no siempre será cierto. Por ejemplo, el siguiente nodo a N3 es G3, sin embargo el siguiente hermano a N3 es null. De la misma forma, el nodo anterior a N4 es G3, mientras que el hermano anterior de N4 es null.

//Se recupera el siguiente hermano del nodo actual
RtfTreeNode nodoSiguiente = nodo.NextNode;

//Se recupera el hermano anterior del nodo actual
RtfTreeNode nodoAnterior = nodo.PreviousNode;

En siguiente apartado veremos cómo podemos localizar nodos concretos del árbol RTF sin tener que recorrerlo al completo mediante los métodos de navegación presentados.

Dejar un comentario

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información. Aceptar Más Información

Política de Privacidad y Cookies