/// <summary>
        /// Parse EDIFACT UNG header
        /// </summary>
        /// <param name="input">Input string</param>
        /// <param name="dataElementSeparator">Data element separator</param>
        /// <param name="releaseIndicator">Release indicator</param>
        /// <param name="componentDataElementSeparator">Component data element separator</param>
        /// <param name="segmentTerminator">Segment terminator</param>
        /// <returns>XML document with structure from headers.xsd EDIFACT UNA header description</returns>
        public static HeadersUNG ParseEDIFACTUNGHeader(
            string input,
            string dataElementSeparator,
            string releaseIndicator,
            string componentDataElementSeparator,
            string segmentTerminator
            )
        {
            if (input == null)
            {
                return(null);
            }

            HeadersUNG _UNGHeader = new HeadersUNG();

            Regex _UNGRegex = new Regex(CreateParsePattern(_UNGGenericPattern, dataElementSeparator, releaseIndicator, componentDataElementSeparator, segmentTerminator));
            Match _UNGMatch = _UNGRegex.Match(input);

            string _escapedReleaseIndicator = EscapeRegexCharacter(releaseIndicator);

            try
            {
                if (_UNGMatch != null)
                {
                    // If headers.xsd was changed, change appropriate fields for new values
                    _UNGHeader.UNG1       = _UNGMatch.Groups["FunctionalGroupIdentification"].ToString().Replace(_escapedReleaseIndicator, String.Empty);
                    _UNGHeader.UNG2       = new HeadersUNGUNG2();
                    _UNGHeader.UNG2.UNG21 = _UNGMatch.Groups["SenderIdentification"].ToString().Replace(_escapedReleaseIndicator, String.Empty);
                    _UNGHeader.UNG2.UNG22 = _UNGMatch.Groups["SenderIdentificationCodeQualifier"].ToString().Replace(_escapedReleaseIndicator, String.Empty);
                    _UNGHeader.UNG3       = new HeadersUNGUNG3();
                    _UNGHeader.UNG3.UNG31 = _UNGMatch.Groups["RecipientIdentification"].ToString().Replace(_escapedReleaseIndicator, String.Empty);
                    _UNGHeader.UNG3.UNG32 = _UNGMatch.Groups["RecipientIdentificationCodeQualifier"].ToString().Replace(_escapedReleaseIndicator, String.Empty);
                    _UNGHeader.UNG4       = new HeadersUNGUNG4();
                    _UNGHeader.UNG4.UNG41 = _UNGMatch.Groups["Date"].ToString();
                    _UNGHeader.UNG4.UNG42 = _UNGMatch.Groups["Time"].ToString();
                    _UNGHeader.UNG5       = _UNGMatch.Groups["FunctionalGroupReferenceNumber"].ToString().Replace(_escapedReleaseIndicator, String.Empty);
                    _UNGHeader.UNG6       = _UNGMatch.Groups["ControllingAgency"].ToString().Replace(_escapedReleaseIndicator, String.Empty);
                    _UNGHeader.UNG7       = new HeadersUNGUNG7();
                    _UNGHeader.UNG7.UNG71 = _UNGMatch.Groups["MessageVersionNumber"].ToString().Replace(_escapedReleaseIndicator, String.Empty);
                    _UNGHeader.UNG7.UNG72 = _UNGMatch.Groups["MessageReleaseNumber"].ToString().Replace(_escapedReleaseIndicator, String.Empty);
                    _UNGHeader.UNG7.UNG73 = _UNGMatch.Groups["AssociationAssignedCode"].ToString().Replace(_escapedReleaseIndicator, String.Empty);
                    _UNGHeader.UNG8       = _UNGMatch.Groups["ApplicationPassword"].ToString().Replace(_escapedReleaseIndicator, String.Empty);

                    return(_UNGHeader);
                }
                else
                {
                    throw new ApplicationException("Can't parse a message. Not enough parsing elements found.");
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException(string.Format("Failed to parse UNB header. Reason: {0}", ex.Message), ex);
            }
        }
        /// <summary>
        /// This method serializes EDIFACT headers UNA, UNB and UNG to an XML document, so each segment is an element and is wrapped around header elements
        /// </summary>
        /// <param name="stringHeaderUNA">String with a UNA segment</param>
        /// <param name="stringHeaderUNB">String with a UNA segment</param>
        /// <param name="stringHeaderUNG">String with a UNA segment</param>
        /// <returns>XmlDocument representation of a UNA, UNB and UNG headers</returns>
        public static XmlDocument SerializeEDIFACTHeaders(string stringHeaderUNA, string stringHeaderUNB, string stringHeaderUNG)
        {
            HeadersUNA headerUNA = null;
            HeadersUNB headerUNB = null;
            HeadersUNG headerUNG = null;

            string DataElementSeparator          = string.Empty;
            string ReleaseIndicator              = string.Empty;
            string ComponentDataElementSeparator = string.Empty;
            string SegmentSeparator              = string.Empty;

            if (!string.IsNullOrEmpty(stringHeaderUNA))
            {
                headerUNA = MessageEnrichmentLibrary.EDIHeaders.ParseEDIFACTUNAHeader(
                    stringHeaderUNA,
                    out DataElementSeparator,
                    out ReleaseIndicator,
                    out ComponentDataElementSeparator,
                    out SegmentSeparator
                    );
            }
            else
            {
                headerUNA      = new HeadersUNA();
                headerUNA.UNA2 = "+";
                headerUNA.UNA4 = "?";
                headerUNA.UNA1 = ":";
                headerUNA.UNA6 = "'";
                headerUNA.UNA3 = ",";
                headerUNA.UNA5 = "*";

                DataElementSeparator          = headerUNA.UNA2;
                ReleaseIndicator              = headerUNA.UNA4;
                ComponentDataElementSeparator = headerUNA.UNA1;
                SegmentSeparator              = headerUNA.UNA6;
            }

            headerUNB = MessageEnrichmentLibrary.EDIHeaders.ParseEDIFACTUNBHeader(
                stringHeaderUNB,
                DataElementSeparator,
                ReleaseIndicator,
                ComponentDataElementSeparator,
                SegmentSeparator
                );

            if (!string.IsNullOrEmpty(stringHeaderUNG))
            {
                headerUNG = MessageEnrichmentLibrary.EDIHeaders.ParseEDIFACTUNGHeader(
                    stringHeaderUNG,
                    DataElementSeparator,
                    ReleaseIndicator,
                    ComponentDataElementSeparator,
                    SegmentSeparator
                    );
            }

            // Skip xml declaration for a newly created documents
            StringBuilder     _newXML   = new StringBuilder();
            XmlWriterSettings _settings = new XmlWriterSettings();

            _settings.OmitXmlDeclaration = true;

            // Compose result document
            XmlWriter _writer = XmlWriter.Create(_newXML, _settings);

            _writer.WriteStartElement(_headersPrefix, _headersName, _headersNamespace);
            _writer.WriteRaw(XmlToString(Serialize(headerUNA)));
            _writer.WriteRaw(XmlToString(Serialize(headerUNB)));
            if (headerUNG != null)
            {
                _writer.WriteRaw(XmlToString(Serialize(headerUNG)));
            }
            _writer.WriteEndElement();
            _writer.Flush();

            XmlDocument _newDocument = new XmlDocument();

            _newDocument.LoadXml(_newXML.ToString());
            return(_newDocument);
        }