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

后端 未结 2 882
我在风中等你
我在风中等你 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;
    
    0 讨论(0)
  • 2021-02-06 06:31

    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;
    
    0 讨论(0)
提交回复
热议问题