Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2016, 14:22   #1
m0nr
Пользователь
 
Регистрация: 08.01.2016
Сообщений: 27
Вопрос парсинг в memo

Привет, нужна помощь, допустим в Memo1 текст:
Код:
<?xml version="1.0" encoding="utf-8"?>
<response list="true">
 <message>
  <body>Тут сообщение #2</body>
  <uid>228228228</uid>
 </message>
 <message>
  <body>Сообщение #1</body>
  <uid>322322322</uid>
 </message>
</response>
Нужно чтобы сообщение с тегом <uid>322322322</uid> отправлялось в memo 2 как:
#1 : Сообщение #1
А сообщение с тегом <uid>228228228</uid>
#2 : Тут сообщение #2

Т.е. нужно парсить текст в Memo1 по тегам <body></body> и отправлять сортируя по тегам <uid></uid> в memo2

Help)))
m0nr вне форума Ответить с цитированием
Старый 26.03.2016, 14:43   #2
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

PosEx()
kropotkina-alice вне форума Ответить с цитированием
Старый 26.03.2016, 14:50   #3
m0nr
Пользователь
 
Регистрация: 08.01.2016
Сообщений: 27
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
PosEx()
Спасибо :D
m0nr вне форума Ответить с цитированием
Старый 26.03.2016, 16:04   #4
TaLadno
Форумчанин
 
Регистрация: 03.06.2015
Сообщений: 393
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
PosEx()

В любой непонятной ситуации - пиши свой парсер?

to m0nr:
Код:
unit UnitFrm;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Generics.Collections,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Xml.xmldom, Xml.XMLIntf,
  Xml.Win.msxmldom, Xml.XMLDoc, Vcl.StdCtrls, System.Generics.Defaults;

type
  TMessItem = record
    uid: integer;
    text: string;
  end;

type
  TItemUidComparer = class(TComparer<TMessItem>)
  public
    function Compare(const Item1, Item2: TMessItem): integer; override;
  end;

type
  TForm2 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    function SomeName(Xml: string): TStringList;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

function TForm2.SomeName(Xml: string): TStringList;
var
  i: integer;
  Node: IXMLNode;
  XMLDocument1: TXMLDocument;

  elList: TList<TMessItem>;
  elPars: TMessItem;
  cmp: TItemUidComparer;
begin
  XMLDocument1 := TXMLDocument.Create(self);
  result := TStringList.Create;

  XMLDocument1.XML.Text := Xml;
  XMLDocument1.Active := true;

  elList := TList<TMessItem>.Create;

  for i := 0 to XMLDocument1.ChildNodes.Count - 1 do
  Begin
    Node := XMLDocument1.DocumentElement.ChildNodes[i];

    elPars.uid := Node.ChildNodes['uid'].text.ToInteger;
    elPars.text := Node.ChildNodes['body'].text;

    elList.Add(elPars);
  End;

  cmp := TItemUidComparer.Create;
  elList.Sort(cmp);
  cmp.Free;

  for i := 0 to elList.Count - 1 do
    result.Append(elList[i].text);

  elList.Free;
  XMLDocument1.Free;
End;

procedure TForm2.FormCreate(Sender: TObject);
const
  qXML =
'<?xml version="1.0" encoding="utf-8"?>'+
'<response list="true">'+
' <message>'+
'  <body>Тут сообщение #2</body>'+
'  <uid>228228228</uid>'+
' </message>'+
' <message>'+
'  <body>Сообщение #1</body>'+
'  <uid>322322322</uid>'+
' </message>'+
'</response>';
var
  resStringList: TStringList;
  i: integer;
begin
  resStringList := SomeName(qXML);

  if resStringList.Count > 0 then
    for i := 0 to resStringList.Count - 1 do
      Memo1.Lines.Append(resStringList[i]);

  resStringList.Free;
end;

{ TItemUidComparer }

function TItemUidComparer.Compare(const Item1, Item2: TMessItem): integer;
begin
  if Item1.uid > Item2.uid then
    result := -1
  else if Item1.uid < Item2.uid then
    result := 1
  else
    result := 0;
end;

end.
Всякую там красоту наводи уже сам (проверки, освобождения и другие правильные вещи).

А вообще парсер ничего не должен сортировать, это удел отображалки или где-то в промежутке от парсера, до отображалки
Вы там держитесь.
TaLadno вне форума Ответить с цитированием
Старый 26.03.2016, 16:55   #5
m0nr
Пользователь
 
Регистрация: 08.01.2016
Сообщений: 27
По умолчанию

Цитата:
Сообщение от TaLadno Посмотреть сообщение

В любой непонятной ситуации - пиши свой парсер?
Не ожидал, спасибо :3

Зачем весь код цитировать?
Модератор
m0nr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
парсинг memo begibeqa Общие вопросы Delphi 15 27.01.2014 17:48
Delphi.Чтение файла в Memo, вычисление, добавление строк в Memo antonio_sk Помощь студентам 0 26.04.2013 18:01
Парсинг строчки из Memo Alexunkow Общие вопросы Delphi 2 28.12.2012 18:33
Разделители строки в memo. Парсинг. webber9989 Общие вопросы Delphi 4 30.07.2011 23:36
В Memo сделать так, чтобы текст был разного цвета, разноцветный memo Artem Компоненты Delphi 3 07.09.2007 13:40