En este ejercicio, vamos a modificar un Digi.tab automáticamente para añadirle un concepto que tiene la versión de Digi para MGCP/BTA y que tiene la futura version Digi3D 2010.
En estas versiones de Digi, los códigos pueden tener asociadas etiquetas. Cada código puede tener un número ilimitado de etiquetas, que no son más que nombres separados por comas.
Así pues, si un determinado código tiene el siguiente valor en el campo etiqueta: "Edificios,Edificios en construcción,1:1000" dicho código tendrá tres etiquetas:
a) Edificios
b) Edificios en construcción
c) 1:1000
¿Para que sirven las etiquetas?
Pues básicamente para agrupar códigos.
Si tenemos 10 códigos con la etiqueta "Edificios", podemos ejecutar cualquier orden que trabaje con etiquetas para trabajar con todos esos códigos a la vez.
Ej: En la versión 2010 de DigiNG, podemos ejecutar la orden: BORRA_COD=@Edificios L
para borrar todas las líneas cuyos códigos tengan la etiqueta "Edificios".
Cuando desarrollé el módulo de MGCP para DigiNG, no existía el concepto de etiquetas, sin embargo, era necesario agrupar de alguna manera códigos para hacer topologías. Esto lo hice en el archivo mgcp.xml.
Aquí tenemos un recorte del archivo mgcp.xml
<?xml version="1.0" ?>
<menuMGCP>
<bintop name="Terreno inundable">
BBH090
CBH090
</bintop>
<bintop name="Landcover Area Features">
L1
CZD020
CZD020
CBH030
CBH030
CBH020
CBH130
CBH080
CBH140
CBA040
CDB170
</bintop>
<bintop name="Isla">
BBA030
CBA030
</bintop>
<bintop name="Aeródromo">
BGB005
CGB005
</bintop>
</menuMGCP>
Luego pensé en el concepto de etiquetas para introducir esta tabla de códigos en el digi.tab y añadi la etiqueta "TAGS" a cada uno de los códigos en el digi.tab.
El problema es que luego había que insertar las etiquetas en el digi.tab de MGCP a partir del archivo mgcp.xml de más arriba.
Esta tarea podría haber llevado horas, así que he desarrollado una pequeña aplicación en el lenguaje de programación C# que va a hacer el proceso automáticamente.
Va a cargar el archivo mgcp.xml con los grupos de códigos (en la etiqueta "bintop"), luego va a cargar un digi.tab y va a ir añadiéndo a cada código las etiquetas que le correspondan.
Por último, va a guardar el digi.tab modificado con otro nombre.
Como es una aplicación que se va a ejecutar una única vez, no he dedicado tiempo a comprobar si un determinado código ya tenía una etiqueta o no, eso os lo dejo como tarea de programación.
Utiliza Linq, Xml y XPath.
Aquí está el código:
using System;
using System.Linq;
using System.Xml;
using System.Xml.XPath;
namespace AnadeEtiquetas
{
class Program
{
static void Main(string[] args)
{
XmlDocument digiTab = new XmlDocument();
digiTab.Load("digi.tab.xml");
XPathNavigator navegadorDigiTab = digiTab.CreateNavigator();
XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
using( XmlReader readerMGCP = XmlReader.Create("mgcp.xml", settings) )
{
XPathDocument mgcpXML = new XPathDocument(readerMGCP);
XPathNavigator navegadorMGCP = mgcpXML.CreateNavigator();
foreach(XPathNavigator tablaDeCodigos in navegadorMGCP.Select("/menuMGCP/bintop") )
{
string nombreTabla = tablaDeCodigos.GetAttribute("name", "");
Console.WriteLine("Insertando la tabla {0} en el digi.tab", nombreTabla);
var listaDeCodigos = from código in tablaDeCodigos.Value.Split('\n')
let códigoRecortado = código.Trim()
where códigoRecortado.Length > 0
select códigoRecortado;
foreach (string código in listaDeCodigos)
{
XPathNodeIterator nodosDigiTab = navegadorDigiTab.Select("/digitab/codes/code[@name=\"" + código + "\"]");
foreach (XPathNavigator nodo in nodosDigiTab)
{
if (nodo.MoveToAttribute("tags", ""))
{
nodo.SetValue(nodo.Value + "," + tablaDeCodigos.GetAttribute("name", "").ToString());
}
else
{
nodo.CreateAttribute("", "tags", "", tablaDeCodigos.GetAttribute("name", "").ToString());
}
}
}
}
}
navegadorDigiTab.MoveToRoot();
using (XmlWriter writter = XmlWriter.Create("digitabmodificado.tab.xml"))
{
writter.WriteNode(navegadorDigiTab, false);
writter.Flush();
}
}
}
}





