Inicio Proyectos Librería NRtfTree Documentación NRtfTree Modelo DOM en NRtfTree

Modelo DOM en NRtfTree

por sgoliver

Esta entrada forma parte de una serie de artículos dedicados a NRtfTree, la librería .NET para tratamiento de documentos RTF, entre los cuales podrás encontrar una descripción detallada de la librería, documentación técnica, ejemplos y tutoriales de uso que pueden ser de tu interés. No olvides consultar la página principal de NRtfTree para más información.

En el apartado anterior vimos como las clases RtfTree y RtfTreeNode nos van a dar la posibilidad de tratar los distintos elementos de un documento RTF como si formaran parte de una estructura en forma de árbol. Esto facilita en gran medida el análisis y modificación de un documento por parte de nuestras aplicaciones, siempre de forma muy general y sin imponer en ningún momento tratamientos o conversiones específicas del contenido.

Una vez cargado un documento en el árbol [consultar el siguiente apartado del manual para más información sobre la carga de documentos], cada nodo de éste (de la clase RtfTreeNode) representará un elemento del código RTF, que se diferenciará por su tipo de nodo, su clave, y el valor de su parámetro en caso de existir.

En cuanto al tipo de nodo, almacenado en la propiedad NodeType, NRtfTree considera 5 posibles tipos, declarados en la clase RtfNodeType, de acuerdo a los distintos elementos que componen un documento RTF [consultar el apartado de introducción al formato RTF para más detalles]:

Tipo de Nodo Descripción
ROOT Nodo raíz del árbol
KEYWORD Palabra de control
CONTROL Símbolo de control
TEXT Texto del documento
GROUP Grupo RTF

El único tipo de nodo que no habíamos visto hasta ahora es el llamado nodo raíz o ROOT. Éste es un nodo auxiliar (es decir, no forma parte del documento real) creado por NRtfTree del cual va a partir el resto del árbol RTF del documento. Un árbol RTF vacío será aquel que cuente únicamente con el nodo ROOT.

El segundo elemento destacable de un nodo RTF es su clave, almacenada en la propiedad NodeKey de la clase RtfTreeNode. El contenido de ésta dependerá del tipo de nodo en cuestión, pudiendo tener los siguientes significados:

Tipo de Nodo Contenido de la clave del nodo [propiedad NodeKey]
ROOT Vacío
KEYWORD Palabra de control del nodo [ Ejemplo: \b –> NodeKey = ‘b’ ]
CONTROL Símbolo de control del nodo [ Ejemplo: \~ –> NodeKey = ‘~’ ]
TEXT Texto del nodo
GROUP Vacío

Por último, cada nodo también contendrá el valor de su parámetro, si existe. Este valor se almacenará en la propiedad Parameter de RtfTreeNode. Si el elemento RTF no va acompañado de ningún parámetro, el valor de esta propiedad será 0. Esto nos lleva al problema de distinguir cuándo un nodo no tiene parámetro, o sí lo tiene pero con valor 0. Para ello, cada nodo cuenta también con una propiedad booleana llamada HasParameter, que indica si el nodo tiene o no parámetro asociado.

Por mostrar un pequeño ejemplo de código, si consideramos un nodo equivalente a la palabra de control ‘\deflang3082‘, el siguiente código mostraría la siguiente salida:

Console.WriteLine("Tipo: " + nodo.NodeType);
Console.WriteLine("Clave: " + nodo.NodeKey);
Console.WriteLine("Tiene parámetro: " + nodo.HasParameter);
Console.WriteLine("Valor parámetro: " + nodo.Parameter);

/******************************
Salida del programa:

Tipo: KEYWORD
Clave: deflang
Tiene parámetro: True
Valor parámetro: 3082
*******************************/

Con todos estos elementos en cuenta, ya podemos ver un ejemplo del árbol RTF creado por NRtfTree para un documento sencillo. A continuación se muestra un documento con formato, su código interno RTF, y una representación textual del árbol RTF creado por NRtfTree (en formato «<Tipo>: <Clave> <Parámetro>»):

Texto enriquecido del documento

NRTFTree v0.1 es una librería escrita en C# para el tratamiento estructurado de documentos RTF.

Código RTF interno del documento

{\rtf1\ansi\ansicpg1252\deff0\deflang3082
{\fonttbl{\f0\fswiss\fcharset0 Arial;}{\f1\fmodern\fprq1\fcharset0 Courier New;}}
{\colortbl ;\red255\green0\blue0;\red0\green0\blue128;}
\viewkind4\uc1\pard\b\f0\fs20 NRTFTree v0.1\b0 es una librer\’eda \cf1\b\fs24 escrita en C# \cf0\b0\fs20 para el \cf2\i\fs24 tratamiento estructurado\fs20 \cf0\i0 de\f1\fs40 documentos RTF\f0\fs20 .\par}

Árbol RTF generado por NRtfTree

ROOT
  GROUP
    KEYWORD: rtf 1
    KEYWORD: ansi
    KEYWORD: ansicpg 1252
    KEYWORD: deff 0
    KEYWORD: deflang 3082
    GROUP
      KEYWORD: fonttbl
      GROUP
        KEYWORD: f 0
        KEYWORD: fswiss
        KEYWORD: fcharset 0
        TEXT: Arial;
      GROUP
        KEYWORD: f 1
        KEYWORD: fmodern
        KEYWORD: fprq 1
        KEYWORD: fcharset 0
        TEXT: Courier New;
    GROUP
      KEYWORD: colortbl
      TEXT: ;
      KEYWORD: red 255
      KEYWORD: green 0
      KEYWORD: blue 0
      TEXT: ;
      KEYWORD: red 0
      KEYWORD: green 0
      KEYWORD: blue 128
      TEXT: ;
    KEYWORD: viewkind 4
    KEYWORD: uc 1
    KEYWORD: pard
    KEYWORD: b
    KEYWORD: f 0
    KEYWORD: fs 20
    TEXT: NRTFTree v0.1
    KEYWORD: b 0
    TEXT: es una librer
    CONTROL: ' 237
    TEXT: a
    KEYWORD: cf 1
    KEYWORD: b
    KEYWORD: fs 24
    TEXT: escrita en C#
    KEYWORD: cf 0
    KEYWORD: b 0
    KEYWORD: fs 20
    TEXT: para el
    KEYWORD: cf 2
    KEYWORD: i
    KEYWORD: fs 24
    TEXT: tratamiento estructurado
    KEYWORD: fs 20
    TEXT:�
    KEYWORD: cf 0
    KEYWORD: i 0
    TEXT: de
    KEYWORD: f 1
    KEYWORD: fs 40
    TEXT: documentos RTF
    KEYWORD: f 0
    KEYWORD: fs 20
    TEXT: .
    KEYWORD: par

En la figura anterior se muestra cada elemento del documento RTF con su nivel dentro del árbol, su tipo de nodo, la palabra clave o símbolo de control correspondiente y su parámetro asociado en caso de existir. Como puede comprobarse, la estructura de árbol del documento proviene de la dependencia creada entre los nodos de tipo Grupo y sus nodos hijos asociados. NRtfTree tan sólo crea esta dependencia para los grupos RTF (y para el nodo ROOT), los demás tipos de nodo no tendrán descendientes en el árbol.

Una vez cargado el documento, las clases RtfTree y RtfTreeNode proporcionan una serie de métodos sencillos con los que se puede recorrer el árbol y modificar su contenido añadiendo, modificando o eliminando nodos. En el siguiente apartado veremos los mecanismos disponibles para navegar entre los nodos de un árbol RTF [Para una información más detallada de todos los métodos y propiedades disponibles también se puede consultar la documentación de la API de la librería proporcionada en formato CHM o HTML junto al código fuente de la misma].

Veamos un ejemplo de documento RTF donde aparecen todos los elementos comentados:

{\rtf1\ansi\ansicpg1252\deff0\deflang3082
{\fonttbl{\f0\fswiss\fcharset0 Arial;}{\f1\fmodern\fprq1\fcharset0 Courier New;}}
{\colortbl ;\red255\green0\blue0;\red0\green0\blue128;}
\viewkind4\uc1\pard\b\f0\fs20 NRTFTree v0.1\b0 es una librer\’eda \cf1\b\fs24 escrita en C# \cf0\b0\fs20 para el \cf2\i\fs24 tratamiento estructurado\fs20 \cf0\i0 de\f1\fs40 documentos RTF\f0\fs20 .\par}

El código RTF mostrado corresponde al texto con formato siguiente:

NRTFTree v0.1 es una librería escrita en C# para el tratamiento estructurado de documentos RTF.

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