/// <summary>
        /// Demonstrates how to disable validation when writing an XLIFF document.
        /// </summary>
        /// <param name="document">The document to write.</param>
        /// <param name="file">The path to the document to write.</param>
        public static void DisableValidationOnWrite(XliffDocument document, string file)
        {
            using (IO.FileStream stream = new IO.FileStream(file, IO.FileMode.Create, IO.FileAccess.Write))
            {
                XliffWriter writer;
                XliffWriterSettings settings;

                settings = new XliffWriterSettings();
                settings.Validators.Clear();

                writer = new XliffWriter(settings);
                writer.Serialize(stream, document);
            }
        }
        /// <summary>
        /// Serializes an <see cref="XliffDocument"/> to a stream.
        /// </summary>
        /// <param name="stream">The stream to write to.</param>
        /// <param name="document">The document to write.</param>
        public void Serialize(Stream stream, XliffDocument document)
        {
            XmlWriterSettings settings;

            ArgValidator.Create(stream, "stream").IsNotNull();
            ArgValidator.Create(document, "document").IsNotNull();

            settings        = new XmlWriterSettings();
            settings.Indent = this.settings.Indent;
            if (settings.Indent && (this.settings.IndentChars != null))
            {
                settings.IndentChars = this.settings.IndentChars;
            }

            using (XmlWriter writer = XmlWriter.Create(stream, settings))
            {
                this.Serialize(writer, document);
            }
        }
        /// <summary>
        /// Serializes an element into a stream.
        /// </summary>
        /// <param name="stream">The stream to write to.</param>
        /// <param name="element">The element to serialize.</param>
        /// <param name="serializeInnerContent">True to serialize inner content. If false only the opening and closing
        /// tags will be serialized along with attributes.</param>
        public static void SerializeElement(Stream stream, ResourceStringContent element, bool serializeInnerContent)
        {
            IXliffDataProvider provider;
            IEnumerable<ElementInfo> children;
            XliffWriter writer;
            XmlWriterSettings settings;

            Debug.Assert(element != null, "The element should not be null.");
            Debug.Assert(element.Parent != null, "The element parent should not be null.");
            Debug.Assert(stream != null, "The stream should not be null.");

            settings = new XmlWriterSettings();
            settings.OmitXmlDeclaration = true;

            writer = new XliffWriter();
            writer.writer = XmlWriter.Create(stream, settings);
            writer.writer.WriteStartDocument();

            provider = element.Parent;
            children = provider.GetXliffChildren();
            foreach (ElementInfo pair in children)
            {
                if (pair.Element == element)
                {
                    // Don't use the namespace or prefix otherwise they'll be output for fragments. The namespaces
                    // should be written to the root xliff node so they'll be ok for the final document.
                    writer.SerializeImpl(
                                         pair.LocalName,
                                         null,
                                         null,
                                         pair.Element,
                                         null,
                                         serializeInnerContent);
                    break;
                }
            }

            writer.writer.WriteEndDocument();
            writer.writer.Flush();
        }
        /// <summary>
        /// Serializes an element into a stream.
        /// </summary>
        /// <param name="stream">The stream to write to.</param>
        /// <param name="element">The element to serialize.</param>
        /// <param name="serializeInnerContent">True to serialize inner content. If false only the opening and closing
        /// tags will be serialized along with attributes.</param>
        public static void SerializeElement(Stream stream, ResourceStringContent element, bool serializeInnerContent)
        {
            IXliffDataProvider        provider;
            IEnumerable <ElementInfo> children;
            XliffWriter       writer;
            XmlWriterSettings settings;

            Debug.Assert(element != null, "The element should not be null.");
            Debug.Assert(element.Parent != null, "The element parent should not be null.");
            Debug.Assert(stream != null, "The stream should not be null.");

            settings = new XmlWriterSettings();
            settings.OmitXmlDeclaration = true;

            writer        = new XliffWriter();
            writer.writer = XmlWriter.Create(stream, settings);
            writer.writer.WriteStartDocument();

            provider = element.Parent;
            children = provider.GetXliffChildren();
            foreach (ElementInfo pair in children)
            {
                if (pair.Element == element)
                {
                    // Don't use the namespace or prefix otherwise they'll be output for fragments. The namespaces
                    // should be written to the root xliff node so they'll be ok for the final document.
                    writer.SerializeImpl(
                        pair.LocalName,
                        null,
                        null,
                        pair.Element,
                        null,
                        serializeInnerContent);
                    break;
                }
            }

            writer.writer.WriteEndDocument();
            writer.writer.Flush();
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="XliffWriter"/> class.
        /// </summary>
        /// <param name="settings">The settings describing how to write content.</param>
        public XliffWriter(XliffWriterSettings settings)
        {
            ArgValidator.Create(settings, "settings").IsNotNull();

            this.settings = settings;
        }
        /// <summary>
        /// Serializes an <see cref="XliffDocument"/> to a stream.
        /// </summary>
        /// <param name="stream">The stream to write to.</param>
        /// <param name="document">The document to write.</param>
        public void Serialize(Stream stream, XliffDocument document)
        {
            XmlWriterSettings settings;

            ArgValidator.Create(stream, "stream").IsNotNull();
            ArgValidator.Create(document, "document").IsNotNull();

            settings = new XmlWriterSettings();
            settings.Indent = this.settings.Indent;
            if (settings.Indent && (this.settings.IndentChars != null))
            {
                settings.IndentChars = this.settings.IndentChars;
            }

            using (XmlWriter writer = XmlWriter.Create(stream, settings))
            {
                this.Serialize(writer, document);
            }
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="XliffWriter"/> class.
        /// </summary>
        /// <param name="settings">The settings describing how to write content.</param>
        public XliffWriter(XliffWriterSettings settings)
        {
            ArgValidator.Create(settings, "settings").IsNotNull();

            this.settings = settings;
        }