How Check if a XML file if well formed using delphi?

You can use the IXMLDOMParseError interface returned by the MSXML DOMDocument

this interface return a serie of properties which help you to identify the problem.

  • errorCode Contains the error code of the last parse error. Read-only.
  • filepos Contains the absolute file position where the error occurred. Read-only.
  • line Specifies the line number that contains the error. Read-only.
  • linepos Contains the character position within the line where the error occurred.
  • reason Describes the reason for the error. Read-only.
  • srcText Returns the full text of the line containing the error. Read-only.
  • url Contains the URL of the XML document containing the last error. Read-only.

check these two functions which uses the MSXML 6.0 (you can use another versions as well)

uses
  Variants,
  Comobj,
  SysUtils;

function IsValidXML(const XmlStr :string;var ErrorMsg:string) : Boolean;
var
  XmlDoc : OleVariant;
begin
  XmlDoc := CreateOleObject('Msxml2.DOMDocument.6.0');
  try
    XmlDoc.Async := False;
    XmlDoc.validateOnParse := True;
    Result:=(XmlDoc.LoadXML(XmlStr)) and (XmlDoc.parseError.errorCode = 0);
    if not Result then
     ErrorMsg:=Format('Error Code : %s  Msg : %s line : %s Character  Position : %s Pos in file : %s',
     [XmlDoc.parseError.errorCode,XmlDoc.parseError.reason,XmlDoc.parseError.Line,XmlDoc.parseError.linepos,XmlDoc.parseError.filepos]);
  finally
    XmlDoc:=Unassigned;
  end;
end;

function IsValidXMLFile(const XmlFile :TFileName;var ErrorMsg:string) : Boolean;
var
  XmlDoc : OleVariant;
begin
  XmlDoc := CreateOleObject('Msxml2.DOMDocument.6.0');
  try
    XmlDoc.Async := False;
    XmlDoc.validateOnParse := True;
    Result:=(XmlDoc.Load(XmlFile)) and (XmlDoc.parseError.errorCode = 0);
    if not Result then
     ErrorMsg:=Format('Error Code : %s  Msg : %s line : %s Character  Position : %s Pos in file : %s',
     [XmlDoc.parseError.errorCode,XmlDoc.parseError.reason,XmlDoc.parseError.Line,XmlDoc.parseError.linepos,XmlDoc.parseError.filepos]);
  finally
    XmlDoc:=Unassigned;
  end;
end;

How are you creating/receiving the XML? Any sensible parser would catch this.

For example, using OmniXML

uses
  OmniXML;

type
  TForm1=class(TForm)
    Memo1: TMemo;
    //...
  private
    FXMLDoc: IXMLDocument;
    procedure FormCreate(Sender: TObject);
    procedure CheckXML;
  end;

implementation

uses
  OmniXMLUtils;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Load your sample XML. Can also do Memo1.Text := YourXML
  Memo1.Lines.LoadFromFile('YourXMLFile.xml');
end;

procedure TForm1.CheckXML;
begin
  FXMLDoc := CreateXMLDoc;
  // The next line raises an exception with your sample file.
  XMLLoadFromAnsiString(FXMLDoc, Memo1.Text); 
end;

Tags:

Xml

Delphi