Zitat von
Fellmer Lloyd:
"Non-validating
XML parser"
-Bringt das DTD denn noch was?
Äh, ich kann zwar jetzt nur für MS-
XML sprechen, aber der dortige Validator ist ja gleich eingebaut und kostet dich im Prinzip ein Lächeln. Wenn deine
XML-Datei eine DTD benutzt, dann reicht bspw. folgendes:
Delphi-Quellcode:
Memo1.Clear;
xmldoc.load(FileListBox1.Items[FileListBox1.ItemIndex]);
if(xmldoc.parseError.errorCode <> 0) then
begin
Memo1.Lines.LoadFromFile(
FileListBox1.Items[FileListBox1.ItemIndex]
);
MessageDlg(Format('%s in Zeile %d, Position %d' + #13#10 + '%s',
[xmldoc.parseError.reason,xmldoc.parseError.line,
xmldoc.parseError.linepos,xmldoc.parseError.srcText]),
mtError,[mbOk],0);
end
else
begin
Memo1.Lines.Text := xmldoc.xml;
MessageDlg('Alles okay',mtInformation,[mbOk],0);
end;
um Fehler zu finden.
Wenn dein
XML-Dokument keine DTD benutzt, bzw. wenn es nicht deins ist, du es aber dennoch gern prüfen würdest, dann geht das bspw. mit einer externen XSD-Datei. Hier ein etwas größerer Auszug:
Delphi-Quellcode:
// create XSD schema
xsd := CoXMLSchemaCache40.Create;
if(xsd =
nil)
then
begin
MessageBox(self.Handle,
pchar(NOXMLPARSER),
nil,
MB_OK
or MB_ICONEXCLAMATION);
fErrorExit := true;
Application.Terminate;
exit;
end;
xsd.add('
',ExtractFilePath(paramstr(0)) + '
MO.xsd');
// try to create a XML parser
xmldoc := CoDOMDocument40.Create;
xmldoc.async := false;
xmldoc.resolveExternals := true;
xmldoc.validateOnParse := true;
// XSD-Schema zuweisen
xmldoc.schemas := xsd;
xmldoc.load(fSavePath + '
\' + DATABASE_FNAME);
// errors while loading, uh-oh, ... :o(
if(xmldoc.parseError.errorCode <> 0)
then
begin
if(MessageBox(self.Handle,pchar(
Format(XMLDATABASEERROR,[xmldoc.parseError.reason,
xmldoc.parseError.errorCode,xmldoc.parseError.line,
xmldoc.parseError.linepos,xmldoc.parseError.srcText])),
nil,
MB_YESNO
or MB_ICONQUESTION) = IDNO)
then
begin
fErrorExit := true;
Application.Terminate;
exit;
end;
xmldoc.loadXML('
<?xml version="1.0"?><' + mainnode + '
/>')
end;
Der Rest läuft dann wieder wie gehabt: Sind Fehler drin, werden die angezeigt.
Ansonsten müsstest du noch mal fragen, wenn du speziell etwas zum Thema Validieren wissen willst.