コード例 #1
0
        private XDocument GetSchemaValidatedDocument(string markup)
        {
            XNamespace markupNs = $"http://tempuri.org/markup{MarkupVersion}.xsd";

            var schemaPath = _schemaFileLocator.GetSchemaPath(MarkupVersion);

            using (var schemaXmlReader = XmlReader.Create(File.OpenRead(schemaPath)))
            {
                var settings = new XmlReaderSettings();
                settings.Schemas.Add(markupNs.ToString(), schemaXmlReader);
                settings.Schemas.Compile();

                settings.ValidationType   = ValidationType.Schema;
                settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
                settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
                settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;

                var errors = new List <TemplateError>();
                settings.ValidationEventHandler += (object sender, ValidationEventArgs e) =>
                {
                    var lineInfo = (IXmlLineInfo)sender;
                    errors.Add(new TemplateError()
                    {
                        Message      = e.Message,
                        LineNumber   = lineInfo.LineNumber,
                        LinePosition = lineInfo.LinePosition,
                        Code         = TemplateErrorCode.InvalidSchema,
                        Level        = TemplateErrorLevel.Error
                    });
                };

                using (var markupReader = new StringReader(markup))
                    using (var markupXmlReader = XmlReader.Create(markupReader))
                    {
                        // TODO: Handle errors when loading this doc (malformed XML)
                        // Create a temporary document and add the namespace to the root
                        var tempDocument = XDocument.Load(markupXmlReader, LoadOptions.SetLineInfo);
                        foreach (var element in tempDocument.Descendants())
                        {
                            element.Name = markupNs + element.Name.ToString();
                        }

                        string tempDocumentText = null;
                        using (var tempDocumentStringWriter = new StringWriter())
                            using (var tempDocumentTextWriter = XmlWriter.Create(tempDocumentStringWriter))
                            {
                                tempDocument.WriteTo(tempDocumentTextWriter);
                                tempDocumentTextWriter.Flush();
                                tempDocumentText = tempDocumentStringWriter.GetStringBuilder().ToString();
                            }

                        using (var textDocumentReader = new StringReader(tempDocumentText))
                            using (var tempDocumentXmlReader = XmlReader.Create(textDocumentReader, settings))
                            {
                                var document = XDocument.Load(tempDocumentXmlReader, LoadOptions.SetLineInfo);

                                if (errors.Any())
                                {
                                    throw new InvalidTemplateSyntaxException(errors);
                                }

                                return(document);
                            }
                    }
            }
        }