如何使用XmlSchema验证器?

如何使用XmlSchema验证器?

有段时间前,自己想要做一个xmlschema的验证器,首先想到的就是delphi的vcl中是否已经有现成的函数或者对象,经过一番查找,发现里面只封装了Dom中的Document,对于与Document密切相关的schema几乎看不到踪影如何使用XmlSchema验证器?;然后到网络上进行搜寻,发现关于这个验证器的信息很少(也许搜索技术不好^_^);最后没有办法,找到了‘xml schema complete reference’这本英文电子书,凭着兴趣我居然读完了大半内容,实际上读这本书的过程是超爽的,因为讲到了自己想要的东西。

既然没有现成的可以用,那么我就用微软留给我们的编程接口(1)对于xml文件,我们都知道微软提供了Dom(文档对象模型)来访问遍历它,而对于xml Schema文件来说,其实它也是个xml文件,所以我们依旧可以用Dom来去访问它(2)Dom的早期版本中并没有一个Schemas的属性,只有到了msxml4.dll及以后的版本才提供了这个属性,所以早期版本的Dom是不能够验证xmlschema,要用DOMDocument40对象

下面代码示例:

var
iDomDoc40: DOMDocument40;
iSchemaDoc: DOMDocument40;
iDomParseError: IXMLDOMParseError ;
iSchemaCache: XMLSchemaCache40;
sNameSpace: string;
// iXMLSchema: ISchema;
begin
iSchemaDoc := CoDOMDocument40.Create;
iSchemaDoc.async := False;
iSchemaDoc.validateOnParse := False;
iSchemaDoc.load('address.xsd');

//得到命名空间
sNameSpace := iSchemaDoc.documentElement.getAttributeNode('xmlns:xs').Value;

iSchemaCache := CoXMLSchemaCache40.Create;
iSchemaCache.add(sNameSpace, iSchemaDoc);
// iXMLSchema := iSchemaCache.getSchema(sNameSpace);

iDomDoc40 := CoDOMDocument40.Create;
iDomDoc40.async := False;

//主要是下面这两行代码
iDomDoc40.validateOnParse := True;
iDomDoc40.schemas := iSchemaCache;
iDomDoc40.load('address.xml');
iDomParseError := iDomDoc40.parseError;
if iDomParseError.errorCode = 0 then
ShowMessage('验证成功');

//如果验证失败,还可以通过下面的信息来定位错误的地方

//iDomParseError.reason;
// iDomParseError.srcText;
// iDomParseError.line;

end;