МУ_ЛР_ЛиПОАС. Методические указания по выполнению лабораторных работ по дисциплине (модулю) Лингвистическое и программное обеспечение автоматизированных систем
Скачать 2.76 Mb.
|
2.37. Проверка XML-документа в DOMПо умолчанию класс XmlDocument не сверяет код XML в модели DOM ни с данными схемы XSD, ни c определением типа документа (DTD). Код XML проверяется только на правильность формата. С целью проверки XML в модели DOM можно проверить код XML в процессе его загрузки; для этого нужно передать проверяющий схему XmlReader методу Load класса XmlDocument или проверить ранее не проверенный XML-документ в модели DOM с помощью метода Validate класса XmlDocument. После успешной проверки применяются настройки схемы по умолчанию, текстовые значения по необходимости преобразуются в атомарные, а сведения о типах ассоциируются с проверенными информационными элементами. В результате типизированные XML-данные заменяют ранее не типизированные XML-данные. Для создания объекта XmlReader с проверкой по схеме выполните следующие действия. Сформируйте новый экземпляр класса XmlReaderSettings. Добавьте схему XML к свойству Schemas экземпляра XmlReaderSettings. Укажите Schema в качестве ValidationType. Дополнительно можно указать ValidationFlags и ValidationEventHandler для обработки ошибок проверки по схеме, а также предупреждений, выданных в процессе проверки. Наконец, передайте объект XmlReaderSettings методу Create класса XmlReader вместе с XML-документом; в результате будет создан объект XmlReader с проверкой по схеме. В следующем примере кода объект XmlReader с проверкой по схеме проверяет XML-данные, загружаемые в модель DOM. В XML-документ вносятся недействительные изменения; документ вновь подвергается проверке, что приводит к появлению ошибок проверки схемы. Наконец, одна из ошибок исправляется, после чего часть XML-документа подвергается частичной проверке. C# using System; using System.Xml; using System.Xml.Schema; class XmlDocumentValidationExample { static void Main(string[] args) { try { // Create a schema validating XmlReader. XmlReaderSettings settings = new XmlReaderSettings(); settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd"); settings.ValidationEventHandler += new ValidationEventHandler(ValidationEventHandler); settings.ValidationFlags = settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings; settings.ValidationType = ValidationType.Schema; XmlReader reader = XmlReader.Create("contosoBooks.xml", settings); // The XmlDocument validates the XML document contained // in the XmlReader as it is loaded into the DOM. XmlDocument document = new XmlDocument(); document.Load(reader); // Make an invalid change to the first and last // price elements in the XML document, and write // the XmlSchemaInfo values assigned to the price // element during load validation to the console. XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable); manager.AddNamespace("bk", "http://www.contoso.com/books"); XmlNode priceNode = document.SelectSingleNode(@"/bk:bookstore/bk:book/bk:price", manager); Console.WriteLine("SchemaInfo.IsDefault: {0}", priceNode.SchemaInfo.IsDefault); Console.WriteLine("SchemaInfo.IsNil: {0}", priceNode.SchemaInfo.IsNil); Console.WriteLine("SchemaInfo.SchemaElement: {0}", priceNode.SchemaInfo.SchemaElement); Console.WriteLine("SchemaInfo.SchemaType: {0}", priceNode.SchemaInfo.SchemaType); Console.WriteLine("SchemaInfo.Validity: {0}", priceNode.SchemaInfo.Validity); priceNode.InnerXml = "A"; XmlNodeList priceNodes = document.SelectNodes(@"/bk:bookstore/bk:book/bk:price", manager); XmlNode lastprice = priceNodes[priceNodes.Count - 1]; lastprice.InnerXml = "B"; // Validate the XML document with the invalid changes. // The invalid changes cause schema validation errors. document.Validate(ValidationEventHandler); // Correct the invalid change to the first price element. priceNode.InnerXml = "8.99"; // Validate only the first book element. The last book // element is invalid, but not included in validation. XmlNode bookNode = document.SelectSingleNode(@"/bk:bookstore/bk:book", manager); document.Validate(ValidationEventHandler, bookNode); } catch (XmlException ex) { Console.WriteLine("XmlDocumentValidationExample.XmlException: {0}", ex.Message); } catch(XmlSchemaValidationException ex) { Console.WriteLine("XmlDocumentValidationExample.XmlSchemaValidationException: {0}", ex.Message); } catch (Exception ex) { Console.WriteLine("XmlDocumentValidationExample.Exception: {0}", ex.Message); } } static void ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs args) { if (args.Severity == XmlSeverityType.Warning) Console.Write("\nWARNING: "); else if (args.Severity == XmlSeverityType.Error) Console.Write("\nERROR: "); Console.WriteLine(args.Message); } } В примере в качестве входных данных используется файл contosoBooks.xml. В примере в качестве входных данных также используется файл contosoBooks.xsd. При проверке XML-данных в процессе их загрузки в модель DOM примите во внимание следующее. В приведенном выше примере в случае обнаружения недействительного типа всегда вызывается обработчик событий ValidationEventHandler. Если обработчик события ValidationEventHandler не установлен на проверяющий XmlReader, при вызове XmlSchemaValidationException возникает исключение Load, когда какой-либо тип атрибута или элемента не совпадает с соответствующим типом, указанным в проверяющей схеме. Когда XML-документ загружается в объект XmlDocument с ассоциированной схемой, которая определяет принимаемые по умолчанию значения, объект XmlDocument рассматривает эти используемые по умолчанию значения так, как если бы они были указаны в документе XML. Это означает, что свойство IsEmptyElement всегда возвращает значение false для элемента, который получил значение по умолчанию из схемы. Даже если в XML-документ элемент был записан как пустой. |