/// <summary>
        /// Parses xml document to <see cref="IPropertyContainer"/>.
        /// </summary>
        /// <param name="document">Xml document.</param>
        /// <param name="schema">Optional schema.</param>
        /// <param name="settings">Optional parse settings.</param>
        /// <param name="context">Optional parse context.</param>
        /// <param name="container">Target property container.</param>
        /// <returns><see cref="IPropertyContainer"/> instance.</returns>
        public static IPropertyContainer ParseXmlDocument(
            XDocument document,
            ISchema?schema = null,
            IXmlParserSettings?settings         = null,
            IXmlParserContext?context           = null,
            IMutablePropertyContainer?container = null)
        {
            document.AssertArgumentNotNull(nameof(document));

            container ??= new MutablePropertyContainer();

            XElement?rootElement = document.Root;

            if (rootElement != null && rootElement.HasElements)
            {
                settings ??= new XmlParserSettings();
                context ??= new XmlParserContext(settings, schema);
                schema ??= context.Schema;

                container.SetSchema(schema);
                container.SetMetadata(context);

                ParseXmlElement(rootElement, (IObjectSchema)schema, settings, context, container);
            }

            return(container);
        }