[Delphi] ХМЛ парсинг одинаковых тегов

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by GreeF, 19 Jul 2013.

  1. GreeF

    GreeF New Member

    Joined:
    26 May 2012
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Повис короче вообще.
    Пытаюсь спарсить инфу с http://steamcommunity.com/groups/createlobby/memberslistxml/
    из тегов <steamid64>.
    Code:
    XMLDocument2.LoadFromFile('http://steamcommunity.com/profiles/'+XMLDocument1.DocumentElement.ChildNodes['members'].ChildNodes['steamID64'].Text+'/?xml=1');
    Соответственно он тащит только первый.
    Видел ещё свойство nextSibling, но не очень понял как оно работает, может с его помощью может вытащить следующие теги?
    [​IMG]
     
  2. long_island

    long_island New Member

    Joined:
    17 Jul 2013
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Я бы регулярки использовал. Хотя возможно это и более затратно.
     
  3. qw1mb1

    qw1mb1 Member

    Joined:
    8 Feb 2013
    Messages:
    113
    Likes Received:
    16
    Reputations:
    8
    Code:
    var s : TStringList; //здесь результат
          tmp : string;
    begin
      tmp := XMLDocument2.LoadFromFile('...');
      s := TStringList.Create();
      while pos('<steamid64>', tmp) > 0 do
      begin
        delete(tmp, 1, pos('<steamid64>', tmp) + length('<steamid64>')-1);
        s.Add(copy(tmp, 1, pos('</steamid64>', tmp)-1));
      end;
      ShowMessage(s.Text); //вывод результата
    end;
    
     
  4. GreeF

    GreeF New Member

    Joined:
    26 May 2012
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Спасибо за полный код, но могли бы просто тункть, я бы сам сделал :eek:
    У меня к вам вопрос такой, компилятор ругается на строку
    Code:
    tmp:=XMLDocument1.LoadFromFile('http://steamcommunity.com/groups/createlobby/memberslistxml/');
    , а именно
    Code:
    [Error] Unit1.pas(85): Incompatible types: 'String' and 'procedure, untyped pointer or untyped parameter'
    Пробовал менять тип переменной, но все так же :D
     
    #4 GreeF, 19 Jul 2013
    Last edited: 19 Jul 2013
  5. qw1mb1

    qw1mb1 Member

    Joined:
    8 Feb 2013
    Messages:
    113
    Likes Received:
    16
    Reputations:
    8
    замени
    Code:
    tmp := XMLDocument2.LoadFromFile('...');
    
    на
    Code:
    XMLDocument2.LoadFromFile('...');
    tmp := XMLDocument2.XML.Text;
    
    просто не пользовался данным компонентом, код писал на коленке. не проверял, но должен работать
     
  6. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    да вы упоротые что ли? самое простое:
    Code:
    uses ..., MSXML, ...;
    
    procedure parse();
    var
      XMLDoc: IXMLDOMDocument;
      Nodes: IXMLDOMNodeList;
      ....
    begin
    
      XMLDoc:= CoDOMDocument.Create; try
      
        XMLDoc.Async:= False;
        XMLDoc.Load('http://steamcommunity.com/groups/createlobby/memberslistxml/');
    
        Nodes:= XMLDoc.GetElementsByTagName('steamID64');
        
        for i:= 0 to Nodes.Length-1 do begin
    
          ShowMessage( (Nodes.Item[I] as IXMLDOMNode).Text );
        end;
      finally
        XMLDoc:= nil;
      end;
    end;
     
  7. qw1mb1

    qw1mb1 Member

    Joined:
    8 Feb 2013
    Messages:
    113
    Likes Received:
    16
    Reputations:
    8
    и чем твой код лучше моего? :D
     
  8. GreeF

    GreeF New Member

    Joined:
    26 May 2012
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Спасибо товарищи :D Мой мозг переработал всю инфу и кажется я понял :eek:
     
  9. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    да хотя бы тем, что строится dom дерево, к элементам которого можно получить вполне удобный доступ без этой херни с pos\delete\copy, тем, что при добавлении какого либо атрибута к тегу <steamID64>, например <steamID64 id="1"> значения все так же будут парситься без переделки кода