/// <summary>
        /// Handle top level elements.
        /// </summary>
        /// <param name="parent">
        /// The parent.
        /// </param>
        /// <param name="localName">
        /// The local name.
        /// </param>
        /// <returns>
        /// The <see cref="StructureReaderBaseV20.ElementActions"/>.
        /// </returns>
        protected override ElementActions HandleTopLevel(IMutableObjects parent, object localName)
        {
            ElementActions actions = null;
            if (NameTableCache.IsElement(localName, ElementNameTable.MetadataStructureDefinition))
            {
                var codelist = new MetadataStructureDefinitionMutableCore();
                ParseAttributes(codelist, this.Attributes);
                parent.AddMetadataStructure(codelist);
                actions = this.AddNameableAction(codelist, this.HandleChildElements);
            }

            return actions;
        }
        /// <summary>
        /// Handles the CodeList element child elements
        /// </summary>
        /// <param name="parent">
        /// The parent ICodelistMutableObject object
        /// </param>
        /// <param name="localName">
        /// The name of the current xml element
        /// </param>
        /// <returns>
        /// The <see cref="StructureReaderBaseV20.ElementActions"/>.
        /// </returns>
        private ElementActions HandleChildElements(MetadataStructureDefinitionMutableCore parent, object localName)
        {
            ElementActions actions = null;
            if (NameTableCache.IsElement(localName, ElementNameTable.TargetIdentifiers))
            {
                actions = this.BuildElementActions(parent, this.HandleChildElements, DoNothing);
            }
            else if (NameTableCache.IsElement(localName, ElementNameTable.ReportStructure))
            {
                IReportStructureMutableObject reportStructure = new ReportStructureMutableCore();
                ParseAttributes(reportStructure, this.Attributes);
                parent.ReportStructures.Add(reportStructure);
                string target = Helper.TrySetFromAttribute(Attributes, AttributeNameTable.target, (string)null);
                if (target != null)
                {
                    reportStructure.TargetMetadatas.Add(target);
                }

                actions = this.AddAnnotableAction(reportStructure, this.HandleChildElements, DoNothing);
            }
            else if (NameTableCache.IsElement(localName, ElementNameTable.FullTargetIdentifier))
            {
                var fullTarget = new MetadataTargetMutableCore();
                ParseAttributes(fullTarget, this.Attributes);

                parent.MetadataTargets.Add(fullTarget);
                actions = this.AddAnnotableAction(fullTarget, this.HandleChildElements, DoNothing);
            }
            else if (NameTableCache.IsElement(localName, ElementNameTable.PartialTargetIdentifier))
            {
                var partialTarget = new MetadataTargetMutableCore();
                ParseAttributes(partialTarget, this.Attributes);
                if (!ObjectUtil.ValidCollection(parent.MetadataTargets))
                {
                    throw new SdmxSyntaxException("FullTargetIdentifier not set or PartialTargetIdentifier in wrong order");
                }

                parent.MetadataTargets.Add(partialTarget);
                var fullTarget = parent.MetadataTargets[0];
                actions = this.AddAnnotableAction(partialTarget, DoNothingComplex, (core, o) => this.HandlePartialChildElement(core, fullTarget, o));
            }

            return actions;
        }