在delphi中使用msxml进行模式验证 [英] schema validation with msxml in delphi
问题描述
我试图根据模式的引用来验证XML文件。 (使用Delphi和MSXML2_TLB。)代码的相关部分如下所示:
I'm trying to validate an XML file against the schema's it references. (Using Delphi and MSXML2_TLB.) The (relevant part of the) code looks something like this:
procedure TfrmMain.ValidateXMLFile;
var
xml: IXMLDOMDocument2;
err: IXMLDOMParseError;
schemas: IXMLDOMSchemaCollection;
begin
xml := ComsDOMDocument.Create;
if xml.load('Data/file.xml') then
begin
schemas := xml.namespaces;
if schemas.length > 0 then
begin
xml.schemas := schemas;
err := xml.validate;
end;
end;
end;
这样做的结果是加载缓存(schemas.length> 0),但是下一个赋值引发了一个例外:只能使用XMLSchemaCache-schemacollections。
This has the result that cache is loaded (schemas.length > 0), but then the next assignment raises an exception: "only XMLSchemaCache-schemacollections can be used."
我应该怎么做?
谢谢,Miel。
推荐答案
我想出了一种似乎有效的方法。我首先加载模式,然后将它们添加到schemacollection。接下来我加载xml文件并将schemacollection分配给其schemas属性。解决方案现在看起来像这样:
I've come up with an approach that seems to work. I first load the schema's explicitly, then add themn to the schemacollection. Next I load the xml-file and assign the schemacollection to its schemas property. The solution now looks like this:
uses MSXML2_TLB
That is:
// Type Lib: C:\Windows\system32\msxml4.dll
// LIBID: {F5078F18-C551-11D3-89B9-0000F81FE221}
function TfrmMain.ValidXML(
const xmlFile: String;
out err: IXMLDOMParseError): Boolean;
var
xml, xsd: IXMLDOMDocument2;
cache: IXMLDOMSchemaCollection;
begin
xsd := CoDOMDocument40.Create;
xsd.Async := False;
xsd.load('http://the.uri.com/schemalocation/schema.xsd');
cache := CoXMLSchemaCache40.Create;
cache.add('http://the.uri.com/schemalocation', xsd);
xml := CoDOMDocument40.Create;
xml.async := False;
xml.schemas := cache;
Result := xml.load(xmlFile);
if not Result then
err := xml.parseError
else
err := nil;
end;
使用XMLSchemaCache40或更高版本很重要。早期版本不符合W3C XML Schema标准,但仅针对XDR Schema(MicroSoft规范)进行验证。
It is important to use XMLSchemaCache40 or later. Earlier versions don't follow the W3C XML Schema standard, but only validate against XDR Schema, a MicroSoft specification.
此解决方案的缺点是我需要加载模式明确。在我看来,应该可以自动检索它们。
The disadvantage of this solution is that I need to load the schema's explicitly. It seems to me that it should be possible to retrieve them automatically.
这篇关于在delphi中使用msxml进行模式验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!