Thema: Delphi Alternative zum MSXML

Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 
#15

Re: Alternative zum MSXML

  Alt 1. Jun 2004, 09:43
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.
  Mit Zitat antworten Zitat