1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| interface
uses
Classes, SysUtils, msxmldom, MSXML2_TLB, xmldom, XMLDoc, XMLIntf;
{ Il faut importer l'activeX MSXML DOM2 4.0 pour obtenir l'unité MSXML2_TLB.pas }
type
EXMLDOMValidationError = class(Exception)
private
FSrcText: DOMString;
FURL: DOMString;
FReason: DOMString;
FErrorCode: Integer;
FLine: Integer;
FLinePos: Integer;
FFilePos: Integer;
public
constructor Create(const ValidationError: IXMLDOMParseError);
property ErrorCode: Integer read FErrorCode;
property URL: DOMString read FURL;
property Reason: DOMString read FReason;
property SrcText: DOMString read FSrcText;
property Line: Integer read FLine;
property LinePos: Integer read FLinePos;
property FilePos: Integer read FFilePos;
end;
procedure Validate(XMLFilename, XSDFilename: TFileName; NameSpaceSchema: string); overload;
procedure Validate(XMLDoc, XSDDoc: IXMLDOMDocument2; NameSpaceSchema: string); overload;
procedure CheckValidationError(ValidationError: IXMLDOMParseError);
function GetXMLDOMDocument2(XMLDoc: IXMLDocument): IXMLDOMDocument2;
resourcestring
RS_EXMLDOM_FILE_VALIDATION_ERROR = 'Document XML non conforme au schéma.'#13#10#13#10+
'Raison:'#13#10'%s'#13#10+
'Ligne: %d'#13#10+
'Position: %d'#13#10+
'Position dans le fichier: %d'#13#10+
'URL: %s'#13#10+
'XML: '#13#10'%s';
RS_EXMLDOM_NOFILE_VALIDATION_ERROR = 'Document XML non conforme au schéma.'#13#10#13#10+
'Raison:'#13#10'%s'#13#10;
implementation
{ EXMLDOMValidationError }
constructor EXMLDOMValidationError.Create(
const ValidationError: IXMLDOMParseError);
begin
FSrcText := ValidationError.srcText;
FURL := ValidationError.url;
FReason := ValidationError.reason;
FErrorCode := ValidationError.errorCode;
FLine := ValidationError.line;
FLinePos := ValidationError.linepos;
FFilePos := ValidationError.filepos;
if FLine>0 then
inherited CreateResFmt(@RS_EXMLDOM_FILE_VALIDATION_ERROR, [FReason,
FLine,
FLinePos,
FFilePos,
FURL,
FSrcText])
else
inherited CreateResFmt(@RS_EXMLDOM_FILE_VALIDATION_ERROR, [FReason]);
end;
function GetXMLDOMDocument2(XMLDoc: IXMLDocument): IXMLDOMDocument2;
begin
XMLDoc.Active := True;
Result := ((XMLDoc.DOMDocument as IXMLDOMNodeRef).GetXMLDOMNode as IXMLDOMDocument2);
end;
procedure CheckValidationError(ValidationError: IXMLDOMParseError);
begin
if ValidationError.errorCode<>0 then
raise EXMLDOMValidationError.Create(ValidationError);
end;
procedure Validate(XMLDoc, XSDDoc: IXMLDOMDocument2;
NameSpaceSchema: string);
var
vSchemaCollection: IXMLDOMSchemaCollection2;
begin
vSchemaCollection := CoXMLSchemaCache40.Create;
vSchemaCollection.add(NameSpaceSchema, XSDDoc);
XMLDoc.schemas := vSchemaCollection;
CheckValidationError(XMLDoc.validate);
end;
procedure Validate(XMLFilename,
XSDFilename: TFileName; NameSpaceSchema: string);
var
vXML,
vSchema: IXMLDOMDocument2;
vSchemaCollection: IXMLDOMSchemaCollection2;
begin
vSchema := CoDOMDocument40.Create;
vSchema.async := False;
vSchema.load(XSDFilename);
vSchemaCollection := CoXMLSchemaCache40.Create;
vSchemaCollection.add(NameSpaceSchema, vSchema);
vXML := CoDOMDocument40.Create;
vXML.async := False;
vXML.validateOnParse := True;
vXML.schemas := vSchemaCollection;
vXML.load(XMLFilename);
CheckValidationError(vXML.parseError);
end;
end. |
Partager