with Sax.Exceptions; with Sax.Locators; with Input_Sources; with Sax.Readers; with Unicode.CES; with Schema.Validators; package Schema.Readers is type Validating_Reader is new Sax.Readers.Reader with private; -- To get full validation of an XML document, you must derive from this -- type. You must also enable the Validation_Feature feature, through a -- call to Set_Feature. -- If you override the Parse method in your code, you must call -- Parse (Validating_Reader (Your_Reader), Input); -- and not Parse (Reader (Your_Reader), Input) to get validation. -- -- In most cases, the reader will find by itself what variable should be -- used, from the contents of the XML file: -- It uses the attribute of the nodes to find out what grammar, for -- instance from the following XML extract: -- -- or -- -- -- The second variant associates a specific grammar with each of the -- namespaces found in the document. procedure Set_Validating_Grammar (Reader : in out Validating_Reader; Grammar : Schema.Validators.XML_Grammar); -- Create an XML reader that will validate its input file. The grammar -- must have been parsed first (most likely through a call to -- Schema.Schema_Readers.Schema_Reader or a call to Parse_Grammar below). -- If other schema files need to be parsed because of the presence of a -- "targetNamespace" attribute, their corresponding grammars will be added -- to grammar, in their own namespace of course. -- If this is not called, no validation will take place. procedure Validation_Error (Reader : in out Validating_Reader; Except : Sax.Exceptions.Sax_Parse_Exception'Class); -- Called when a validation error occurs. -- By default, this raises XML_Validation_Error procedure Set_Debug_Output (Output : Boolean); -- Whether we should output debug traces function To_Absolute_URI (Handler : Validating_Reader; URI : Unicode.CES.Byte_Sequence) return Unicode.CES.Byte_Sequence; -- Convert a URI read in the input stream of Handler to an absolute URI. -- This is used for instance to find the location of a schema file,... procedure Parse_Grammar (Handler : in out Validating_Reader; Xsd_File : Unicode.CES.Byte_Sequence; Add_To : in out Schema.Validators.XML_Grammar); -- Parse the grammar to use from an XSD file, and add it to Add_To. -- The resulting grammar can be passed to Set_Validating_Grammar. function Get_Namespace_From_Prefix (Handler : Validating_Reader; Prefix : Unicode.CES.Byte_Sequence) return Unicode.CES.Byte_Sequence_Access; -- Get the namespace associated with a given prefix, in the current -- context. -- The caller must not modify the return value. private type Prefix_Mapping; type Prefix_Mapping_Access is access Prefix_Mapping; type Prefix_Mapping is record Prefix : Unicode.CES.Byte_Sequence_Access; Namespace : Unicode.CES.Byte_Sequence_Access; Next : Prefix_Mapping_Access; end record; -- Usee a list to store the prefixes, since there aren't that many of them, -- and a local prefix can override a more global one (so a hash table needs -- some special handling in any case). type Validator_List_Record; type Validator_List is access Validator_List_Record; type Validator_List_Record is record Element : Schema.Validators.XML_Element; Typ : Schema.Validators.XML_Type; -- Typ will most often be the type of Element, but if the instance has -- specified a xsi:type attribute, this could point to some other type. Grammar : Schema.Validators.XML_Grammar_NS; -- The grammar to which Element belongs Data : Schema.Validators.Validator_Data; Is_Nil : Boolean; -- Whether the element has xsi:nil="true" Start_Loc : Sax.Locators.Locator_Impl_Access; -- Set when starting a sequence of Characters call from the SAX parser Characters : Unicode.CES.Byte_Sequence_Access; -- The current stream of characters we have seen. We need to collapse -- adjacent characters, so that we can validate the full contents of a -- tag at once, and not by parts. Next : Validator_List; end record; type Validating_Reader is new Sax.Readers.Reader with record Grammar : Schema.Validators.XML_Grammar := Schema.Validators.No_Grammar; Validators : Validator_List; Locator : Sax.Locators.Locator_Access; Prefixes : Prefix_Mapping_Access; Id_Validator : Schema.Validators.XML_Validator; Ids : Schema.Validators.Id_Htable_Access; end record; procedure Parse (Parser : in out Validating_Reader; Input : in out Input_Sources.Input_Source'Class); -- Override inherited method. end Schema.Readers;