You can use the IXMLDOMParseError interface returned by the MSXML DOMDocument
this interface returns a series of properties that will help you identify the problem.
- errorCode Contains the error code of the last parsing error. Only for reading.
- filepos Contains the absolute position of the file where the error occurred. Only for reading.
- line Indicates the line number containing this error. Only for reading.
- linepos Contains the position of the character in the line where the error occurred.
- Cause Describes the cause of the error. Only for reading.
- srcText Returns the full text of the string containing the error. Only for reading.
- url Contains the URL of the XML document containing the latest error. Only for reading.
check out these two functions that use MSXML 6.0 (you can also use other versions)
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;
Rruz
source share