/// <summary>
        /// Initializes a new instance of the <see cref="EdiWorkspace"/> class.
        /// </summary>
        /// <param name="ediDocument">
        /// The EDI document.
        /// </param>
        /// <param name="writeableDataLocationFactory">
        /// The writable Data Location Factory.
        /// </param>
        /// <param name="ediParseEngine">
        /// The EDI Parse Engine.
        /// </param>
        public EdiWorkspace(IReadableDataLocation ediDocument, IWriteableDataLocationFactory writeableDataLocationFactory, IEdiParseEngine ediParseEngine)
        {
            this._ediMetadata = ediParseEngine.ParseEDIMessage(ediDocument);
            IFileReader fr = new FileReaderImpl(ediDocument, EdiConstants.EndOfLineRegEx, EdiConstants.CharsetEncoding);

            foreach (var documentPosition in this._ediMetadata.DocumentIndex)
            {
                int start = documentPosition.StartLine;
                this._writeableDataLocation = writeableDataLocationFactory.GetTemporaryWriteableDataLocation();
                using (TextWriter osw = new StreamWriter(this._writeableDataLocation.OutputStream, EdiConstants.CharsetEncoding))
                {
                    while (fr.MoveNext())
                    {
                        int idx = fr.LineNumber;

                        // If this next line is within the bounds of the start and end location then write the current line to the writer  
                        if (idx >= start)
                        {
                            string line = fr.CurrentLine;
                            Write(osw, line + EdiConstants.EndTag);

                            // WriteLineSeparator(osw);

                            // Keep going until we encounter the end segment indicator
                            if (line.StartsWith(EdiPrefix.EndMessageAdministration.ToString()))
                            {
                                break;
                            }
                        }
                    }

                    osw.Flush();
                }

                if (documentPosition.IsData)
                {
                    IEdiDataDocument dataDocument = new EdiDataDocument(this._writeableDataLocation, documentPosition, this._ediMetadata);
                    this._dataDocuments.Add(dataDocument);
                    this._keyFamilyReferences.Add(dataDocument.DataReader.DataSetHeaderObject.DataStructureReference.StructureReference.MaintainableReference);
                }
                else
                {
                    ////IEdiStructureDocument doc = new EDIStructureDocumentImpl(wdl, documentPosition, this._ediMetadata);
                    ////this._beans.Add(doc.SdmxObjects);
                    this._writeableDataLocation.Close();
                }
            }

            this.CreateHeader();
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="SdmxXmlStream"/> class.
        /// </summary>
        /// <param name="writer">
        /// The writer.
        /// </param>
        /// <param name="prettify">
        /// Prettify output.
        /// </param>
        public SdmxXmlStream(IWriteableDataLocation writer, bool prettify)
        {
            var xmlStream = writer as ISdmxXmlStream;
            if (xmlStream != null)
            {
                this._writer = xmlStream.Writer;
            }
            else
            {
                var settings = new XmlWriterSettings();
                if (prettify)
                {
                    settings.Indent = true;
                    settings.NamespaceHandling = NamespaceHandling.OmitDuplicates;
                }

                this._writer = XmlWriter.Create(writer.OutputStream);
                this.AddDisposable(this._writer);
            }
        }