Search code examples
xmldelphidelphi-7

I need help reading a status field from XML


I need to read the status field in this XML text, using Delphi 7.

This XML is inside a TMemo:

<?xml version="1.0" encoding="UTF-8"?>
<licensecloud>
     <request_id>665675780</request_id>
     <request_timestamp>8/4/2018 15:47:44</request_timestamp>
     <request_status>OK</request_status>
     <error_num>0</error_num>
     <error_msg></error_msg>
     <error_desc></error_desc>
     <license>
          <key>a6gdfg567c79afd429d872d</key>
          <dashed>A6589-dfg46D429-D872D</dashed>
          <status>ACTIVE</status>
<trial>no</trial>
<expires/>

So far, I'm doing this with no result, I'm not getting anything:

Uses XMLDoc, XMLIntf;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  XmlFile : TXMLDocument;
  Doc: IXMLDocument;
  MainNode, CustomerNode : IXMLNode;
  i : Integer;
  XMLPath : string;
begin
  Doc := LoadXMLData(Memo1.Text);
  try
   // XmlFile.LoadFromFile(XMLPath);
    Doc.Active := True;
    MainNode := Doc.DocumentElement;

    for i:=0 to MainNode.ChildNodes['licensecloud'].ChildNodes.Count-1 do
    begin
      CustomerNode := MainNode.ChildNodes['licensecloud'].ChildNodes[i];
      //Here you can get any imformation
      ShowMessage(CustomerNode.ChildNodes['status'].Text);

      //ShowMessage(CustomerNode.ChildNodes['address_line_1'].Text);
    end;
  finally
    FreeAndNil(XmlFile);
  end;
end;

Solution

    1. Your xml is invalid. There are missing end tags (</license> and </licensecloud>). Valid xml:

      <?xml version="1.0" encoding="UTF-8"?>
      <licensecloud>
          <request_id>665675780</request_id>
          <request_timestamp>8/4/2018 15:47:44</request_timestamp>
          <request_status>OK</request_status>
          <error_num>0</error_num>
          <error_msg></error_msg>
          <error_desc></error_desc>
          <license>
              <key>a6gdfg567c79afd429d872d</key>
              <dashed>A6589-dfg46D429-D872D</dashed>
              <status>ACTIVE</status>
          </license>
          <trial>no</trial>
          <expires/>
      </licensecloud>
      
    2. MainNode is <licensecloud>. MainNode.ChildNodes['licensecloud'] is incorrect. Correct code:

      procedure TForm1.Button1Click(Sender: TObject);
      var
        XmlFile : TXMLDocument;
        Doc: IXMLDocument;
        MainNode, CustomerNode : IXMLNode;
        i : Integer;
        XMLPath : string;
      begin
      
      
        Doc := LoadXMLData(Memo1.Text);
        try
         // XmlFile.LoadFromFile(XMLPath);
          Doc.Active := True;
          MainNode := Doc.DocumentElement;
      
          ShowMessage(MainNode.ChildNodes['license'].ChildNodes['status'].Text);
        finally
          FreeAndNil(XmlFile);
        end;
      end;