xmldelphixml-parsingtxmldocument

XML parsing, TXMLDocument


I have a problem with parsing XML.

How to get field values se_url and phrase?
I need to get link1_1, link1_2, key1, link2_1, link2_2, key2... which are in se_url and phrase.

I did not find in Google how to do it (also did not find a manual on how to work with TXMLDocument).

<doc>
  <date2>20120214</date2>
  <date1>20120214</date1>
  <data count="116">
    <row>
      <search_engines count="2">
        <search_engine>
          <se_url>link1_1</se_url>
          <se_page>1</se_page>
          <se_id>2</se_id>
        </search_engine>
        <search_engine>
          <se_url>link1_2</se_url>
          <se_page>1</se_page>
          <se_id>3</se_id>
        </search_engine>
      </search_engines>
      <denial>0.4889</denial>
      <visits>45</visits>
      <page_views>52</page_views>
      <phrase>key1</phrase>
      <visit_time>126</visit_time>
      <depth>1.1556</depth>
    </row>
    <row>
      <search_engines count="2">
        <search_engine>
          <se_url>link2_1</se_url>
          <se_page>1</se_page>
          <se_id>3</se_id>
        </search_engine>
        <search_engine>
          <se_url>link2_2</se_url>
          <se_page>1</se_page>
          <se_id>6</se_id>
        </search_engine>
      </search_engines>
      <denial>0.5714</denial>
      <visits>42</visits>
      <page_views>50</page_views>
      <phrase>key2</phrase>
      <visit_time>109</visit_time>
      <depth>1.1905</depth>
    </row>
  </data>
</doc>

Solution

  • Try this:

    uses ComObj, MSXML;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      xml: IXMLDOMDocument;
      node: IXMLDomNode;
      nodes_row, nodes_se: IXMLDomNodeList;
      i, j: Integer;
      url: string;
    begin
      // put url or file name
      url := 'http://softez.pp.ua/gg.xml';
    
      xml := CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument;
      xml.async := False;
      xml.load(url); // or use loadXML to load XML document using a supplied string
      if xml.parseError.errorCode <> 0 then
        raise Exception.Create('XML Load error:' + xml.parseError.reason);
    
      Memo1.Clear;
      nodes_row := xml.selectNodes('/doc/data/row');
      for i := 0 to nodes_row.length - 1 do
      begin
        node := nodes_row.item[i];
        Memo1.Lines.Add('phrase=' + node.selectSingleNode('phrase').text);
        nodes_se := node.selectNodes('search_engines/search_engine/se_url');
        for j := 0 to nodes_se.length - 1 do
        begin
          node := nodes_se.item[j];
          Memo1.Lines.Add('url=' + node.text);
        end;
        Memo1.Lines.Add('--------------');
      end;
    end;
    

    Result:

    phrase=key1
    url=link1_1
    url=link1_2
    --------------
    phrase=key2
    url=link2_1
    url=link2_2
    --------------
    

    A Reference to IXMLDOMDocument