/// <summary>
 /// Imprime recursivamente los hijos de un padre en el arco de calculo
 /// </summary>
 /// <param name="nivel"></param>
 /// <param name="idPadre"></param>
 /// <param name="listaArcos"></param>
 private void imprimirHijosCalculo(int nivel, string idPadre, System.Collections.Generic.IList <Arco> listaArcos, LinkbaseCalculo linkbase)
 {
     foreach (ArcoCalculo arco in listaArcos)
     {    //Imprime hijos con el nivel
         foreach (ElementoLocalizable conceptoLoc in arco.ElementoDesde)
         {
             Concept concepto = (Concept)conceptoLoc.Destino;
             if (concepto.Elemento.Id.Equals(idPadre))
             {
                 for (int i = 0; i < nivel; i++)
                 {
                     Debug.Write("\t");
                 }
                 foreach (ElementoLocalizable conceptohaciaLoc in arco.ElementoHacia)
                 {
                     Concept conceptohacia = (Concept)conceptohaciaLoc.Destino;
                     Debug.WriteLine(((arco.Peso < 0) ? "" : "+") + arco.Peso + conceptohacia.Elemento.Id);
                     imprimirHijosCalculo(nivel + 1, conceptohacia.Elemento.Id, listaArcos, linkbase);
                 }
             }
         }
     }
 }
        public void TestCargaTaxonomia()
        {
            TaxonomiaXBRL taxonomiaXBRL = new TaxonomiaXBRL();

            IManejadorErroresXBRL manejadorErrores = new ManejadorErroresCargaTaxonomia();

            taxonomiaXBRL.ManejadorErrores = manejadorErrores;
            //Boolean correcto = taxonomiaXBRL.ProcesarDefinicionDeEsquemaRef("C:\\workspaces\\memoria_xbrl\\Ejercicio Práctico\\taxonomia1-2012-07-01-core.xsd");
            //Boolean correcto = taxonomiaXBRL.ProcesarDefinicionDeEsquemaRef("C:\\dotNet\\AbaxXBRL_1\\AbaxXBRL\\XBRL-CONF-CR5-2012-01-24\\Common\\100-schema\\155-TypeExtension-Valid.xsd");
            taxonomiaXBRL.ProcesarDefinicionDeEsquema(@"C:\taxonomy\mx-ifrs-2014-12-05\full_ifrs_mc_mx_ics_entry_point_2014-12-05.xsd");

            taxonomiaXBRL.CrearArbolDeRelaciones();

            XbrlViewerService serv = new XbrlViewerService();

            var taxDt = serv.CrearTaxonomiaAPartirDeDefinicionXbrl(taxonomiaXBRL);

            var docServ = new DocumentoInstanciaService();

            docServ.PerteneceConceptoAHipercuboEnRol("ifrs-full_ProfitLoss", taxDt, "http://bmv.com.mx/role/ifrs/ias_1_2014-03-05_role-610000");


            foreach (RoleType tipoRol in taxonomiaXBRL.RolesTaxonomia.Values)
            {
                ArbolLinkbase arbolPresentation = taxonomiaXBRL.ConjuntoArbolesLinkbase[tipoRol.RolURI.ToString()][LinkbasePresentacion.RolePresentacionLinkbaseRef];

                NodoLinkbase nodo = arbolPresentation.NodoRaiz;


                ImprimirNodo(0, nodo);

                Debug.WriteLine("________________________________________");
                if (tipoRol.Linkbases.ContainsKey(LinkbaseReferencia.RoleReferenceLinkbaseRef))
                {
                    LinkbaseReferencia linkbase = (LinkbaseReferencia)tipoRol.Linkbases[LinkbaseReferencia.RoleReferenceLinkbaseRef];
                    foreach (Arco arco in linkbase.Arcos)
                    {
                        foreach (ElementoLocalizable elementoDesde in arco.ElementoDesde)
                        {
                            Concept conceptoDesde = (Concept)((Localizador)elementoDesde).Destino;
                            foreach (ElementoLocalizable elementoHacia in arco.ElementoHacia)
                            {
                                Referencia referencia = (Referencia)elementoHacia.Destino;
                                Debug.WriteLine(conceptoDesde.Elemento.Id + " Referencias: ");
                                foreach (ReferenciaParte refPart in referencia.PartesReferencia)
                                {
                                    Debug.WriteLine("\tReferencia:" + refPart.NombreLocal + " : " + refPart.Valor);
                                }
                            }
                        }
                    }
                }

                Debug.WriteLine("________________________________________");
                if (tipoRol.Linkbases.ContainsKey(LinkbaseCalculo.RoleCalculoLinkbaseRef))
                {
                    LinkbaseCalculo linkbase = (LinkbaseCalculo)tipoRol.Linkbases[LinkbaseCalculo.RoleCalculoLinkbaseRef];
                    //Escribir los elementos que no tienen padre
                    Debug.WriteLine(tipoRol.Id);
                    IDictionary <string, string> impresos = new Dictionary <string, string>();
                    foreach (ArcoCalculo arco in linkbase.Arcos)
                    {
                        foreach (ElementoLocalizable elementoDesde in arco.ElementoDesde)
                        {
                            Concept conceptoDesde = (Concept)elementoDesde.Destino;
                            if (!tienePadre(conceptoDesde, linkbase.Arcos))
                            {
                                if (!impresos.ContainsKey(conceptoDesde.Elemento.Id))
                                {
                                    Debug.WriteLine(conceptoDesde.Elemento.Id);
                                    imprimirHijosCalculo(1, conceptoDesde.Elemento.Id, linkbase.Arcos, (LinkbaseCalculo)tipoRol.Linkbases[LinkbaseCalculo.RoleCalculoLinkbaseRef]);
                                    impresos[conceptoDesde.Elemento.Id] = conceptoDesde.Elemento.Id;
                                }
                            }
                        }
                    }
                }
            }

            Assert.IsTrue(true);
        }