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

后端 未结 2 884
我在风中等你
我在风中等你 2021-02-06 06:09

How can I check if a xml file is well formed without invalid chars or tags?

For example, consider this xml:




        
2条回答
  •  陌清茗
    陌清茗 (楼主)
    2021-02-06 06:30

    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;
    

提交回复
热议问题