/// <summary>
        /// Write query structure request
        /// </summary>
        /// <param name="request">
        /// THe <see cref="IQueryStructureRequestInfo"/> to write
        /// </param>
        private void WriteQueryStructureRequest(IQueryStructureRequestInfo request)
        {
            this.WriteStartElement(ElementNameTable.QueryStructureRequest);
            this.WriteAttribute(AttributeNameTable.resolveReferences, request.ResolveReferences);
            if (!request.ReturnDetails)
            {
                // defaults to true. It is an extension to SDMX.
                this.TryWriteAttribute(AttributeNameTable.returnDetails, request.ReturnDetails);
            }

            foreach (IReferenceInfo refBean in request.References)
            {
                this.WriteRef(refBean);
            }

            this.WriteEndElement(); // </QueryStructureRequest>
        }
        /// <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);
        }