/// <summary>
 /// Handles the Category element child elements
 /// </summary>
 /// <param name="parent">
 /// The parent category of this category element
 /// </param>
 /// <param name="localName">
 /// The name of the current xml element
 /// </param>
 /// <returns>
 /// The <see cref="StructureReaderBaseV20.ElementActions"/>.
 /// </returns>
 private ElementActions HandleChildElements(ICategoryMutableObject parent, object localName)
 {
     ElementActions actions = null;
     if (NameTableCache.IsElement(localName, ElementNameTable.Category))
     {
         ICategoryMutableObject category = HandleCategory(this.Attributes);
         parent.AddItem(category);
         actions = this.AddNameableAction(category, this.HandleChildElements);
     }
     else if (NameTableCache.IsElement(localName, ElementNameTable.DataflowRef))
     {
         IReferenceInfo reference = new ReferenceInfo(SdmxStructureEnumType.Dataflow) { ReferenceFrom = parent };
         this._currentDataflowReference = reference;
         actions = this.AddSimpleAction(reference, this.HandleTextChildElement);
     }
     
     return actions;
 }
        /// <summary>
        /// Handles the HierarchicalCodelist element child elements
        /// </summary>
        /// <param name="parent">
        /// The parent IHierarchicalCodelistMutableObject object
        /// </param>
        /// <param name="localName">
        /// The name of the current xml element
        /// </param>
        /// <returns>
        /// The <see cref="StructureReaderBaseV20.ElementActions"/>.
        /// </returns>
        private ElementActions HandleChildElements(IHierarchicalCodelistMutableObject parent, object localName)
        {
            ElementActions actions = null;
            if (NameTableCache.IsElement(localName, ElementNameTable.CodelistRef))
            {
                var codelistRefMutableCore = new CodelistRefMutableCore();
                parent.AddCodelistRef(codelistRefMutableCore);
                this._currentCodelistRef = codelistRefMutableCore;
                IReferenceInfo reference = new ReferenceInfo(SdmxStructureEnumType.CodeList);
                this._currentReference = reference;
                actions = this.BuildElementActions(codelistRefMutableCore, DoNothingComplex, HandleTextChildElement);
            }
            else if (NameTableCache.IsElement(localName, ElementNameTable.Hierarchy))
            {
                var hc = new HierarchyMutableCore();
                ParseAttributes(hc, this.Attributes);
                this._currentHierarchy = hc;
                
                //// TODO java 0.9.9 no isFinal 
                ////hc.IsFinal = Helper.TrySetFromAttribute(this.Attributes, AttributeNameTable.isFinal, hc.IsFinal);
                parent.AddHierarchies(hc);
                actions = this.AddNameableAction(hc, this.HandleChildElements);
            }

            return actions;
        }
        /// <summary>
        /// Handle QueryStructureRequest Child elements
        /// </summary>
        /// <param name="parent">
        /// The parent IQueryStructureRequestInfo object
        /// </param>
        /// <param name="localName">
        /// The name of the current xml element
        /// </param>
        /// <returns>
        /// The <see cref="StructureReaderBaseV20.ElementActions"/>.
        /// </returns>
        private ElementActions HandleChildElements(IQueryStructureRequestInfo parent, object localName)
        {
            SdmxStructureEnumType sdmxStructure;

            if (NameTableCache.IsElement(localName, ElementNameTable.DataflowRef))
            {
                IDataflowReferenceInfo dataflowReferenceInfo = new DataflowReferenceInfo();
                parent.References.Add(dataflowReferenceInfo);
                return this.AddReferenceAction(dataflowReferenceInfo, this.HandleChildElements, this.HandleTextChildElement);
            }

            if (NameTableCache.IsElement(localName, ElementNameTable.MetadataflowRef))
            {
                sdmxStructure = SdmxStructureEnumType.MetadataFlow;
            }
            else if (NameTableCache.IsElement(localName, ElementNameTable.CodelistRef))
            {
                sdmxStructure = SdmxStructureEnumType.CodeList;
            }
            else if (NameTableCache.IsElement(localName, ElementNameTable.HierarchicalCodelistRef))
            {
                sdmxStructure = SdmxStructureEnumType.HierarchicalCodelist;
            }
            else if (NameTableCache.IsElement(localName, ElementNameTable.CategorySchemeRef))
            {
                sdmxStructure = SdmxStructureEnumType.CategoryScheme;
            }
            else if (NameTableCache.IsElement(localName, ElementNameTable.KeyFamilyRef))
            {
                sdmxStructure = SdmxStructureEnumType.Dsd;
            }
            else if (NameTableCache.IsElement(localName, ElementNameTable.MetadataStructureRef))
            {
                sdmxStructure = SdmxStructureEnumType.Msd;
            }
            else
            {
                return null;
            }

            IReferenceInfo referenceInfo = new ReferenceInfo(sdmxStructure);
            parent.References.Add(referenceInfo);
            return this.AddReferenceAction(referenceInfo, DoNothingComplex, this.HandleTextChildElement);
        }
        /// <summary>
        /// Handles the Dataflow element child elements
        /// </summary>
        /// <param name="parent">
        /// The parent IDataflowMutableObject object
        /// </param>
        /// <param name="localName">
        /// The name of the current xml element
        /// </param>
        /// <returns>
        /// The <see cref="StructureReaderBaseV20.ElementActions"/>.
        /// </returns>
        private ElementActions HandleChildElements(IDataflowMutableObject parent, object localName)
        {
            ElementActions actions = null;
            if (NameTableCache.IsElement(localName, ElementNameTable.KeyFamilyRef))
            {
                IReferenceInfo reference = new ReferenceInfo(SdmxStructureEnumType.Dsd);
                this._currentReferenceInfo = reference;
                actions = this.AddReferenceAction(reference, DoNothingComplex, this.HandleTextChildElementKeyFamily);
            }
            else if (NameTableCache.IsElement(localName, ElementNameTable.CategoryRef))
            {
                IReferenceInfo reference = new ReferenceInfo(SdmxStructureEnumType.Category);
                this._currentReferenceInfo = reference;
                this._currentCategoryIds.Clear();
                actions = this.AddReferenceAction(reference, this.HandleChildElementsCategory, this.HandleTextChildElementCategoryRef);
            }

            return actions;
        }