рдбреЗрд▓реНрдлреА рдореЗрдВ InternetPCools FPC рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд▓реЗрдЦ рдХреБрдЫ рд╡реНрдпрд╛рдкрдХ рд╣реИ - рдпрд╣ рдХрдИ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдмрддрд╛рддрд╛ рд╣реИ (рдФрд░ рди рдХреЗрд╡рд▓ рдлреНрд░реА рдкрд╛рд╕реНрдХрд▓ рдХреА рджреБрдирд┐рдпрд╛ рд╕реЗ), рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯрдЯреВрд▓ рдХреЛ рдЗрд╕рдХреА рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдХрд╛рд░рдг рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ - рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрдм (рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ) рдЧрд╛рдпрдм рд╣реИ рдбреЗрд▓реНрдлреА-рд╕рдВрд╕реНрдХрд░рдг рд╕рдорд╛рди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдФрд░ рдкреНрд░рдпреЛрдЬреНрдп рдХреЗ рд╕рд╛рдеред

рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡реЗрдм рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ (XML рдФрд░ HTML) рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА (рдкрд╛рд░реНрд╕рд┐рдВрдЧ) рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛рдУрдВ рдЬреИрд╕реЗ XPath рдФрд░ XQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдФрд░ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рд╕реАрдзреЗ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ рдирд┐рд░реНрдорд┐рдд рдПрдХ рдкреЗрдбрд╝ рдХреЗ рддрддреНрд╡ред

рдЗрдВрдЯрд░рдиреЗрдЯрдЯреВрд▓реЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп


рдЖрдЧреЗ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдмреБрд▓реЗрдЯреЗрдб рдФрд░ рдЧрд┐рдиреЗ рд╣реБрдП рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдЙрди рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд▓рд┐рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ , рддреЛ рдРрд╕рд╛ рдПрдХ рдЫреЛрдЯрд╛ рдХреЛрдб рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ (рдпрд╣ рдЫреЛрдЯреЗ, рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде penultimate рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред ):

uses xquery; const ArticleURL = 'https://habr.com/post/415617'; ListXPath = '//div[@class="post__body post__body_full"]//li[a]'; var ListValue: IXQValue; begin for ListValue in xqvalue(ArticleURL).retrieve.map(ListXPath) do Writeln(ListValue.toString); end. 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдм рдпрд╣ рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдХреЛрдб рдХреЗрд╡рд▓ рдлреНрд░реА рдкрд╛рд╕реНрдХрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЙрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбреЗрд▓реНрдлреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдФрд░ рдЕрдзрд┐рдорд╛рдирддрдГ рд╕рдорд╛рди рд╢реИрд▓реА рдореЗрдВ, рд╕рдорд╛рди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде; рдпрд╣ рднреА рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ InternetTools рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ (рдЗрд╕реЗ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдЕрдиреБрдордд рд╣реИ), рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдпрд╣ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рддрд░реАрдХреЗ


рдпрджрд┐ рдЖрдк рдХрд╛рд░реНрдп рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рджреВрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ - рд╡реЗ 3 рдмрдбрд╝реЗ рд╕рдореВрд╣ рдмрдирд╛рдПрдВрдЧреЗ:

  1. рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд░рдЦрдХрд░, рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓, рдмрд▓реЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдлрдкреАрд╕реА ред рд╕рдВрднрд╡ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рднреА рджреЛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
  2. рдПрдХ DLL рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдПрдирдХреНрд░рд┐рдкреНрдЯ рдХрд░рдирд╛ (рдЗрд╕рдХреЗ рдмрд╛рдж рдХрднреА-рдХрднреА "рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА" рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ), рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЙрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рднреАрддрд░ рдХрд╛рдо рдХрд░рдирд╛ред рдпрджреНрдпрдкрд┐ COM рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ DLL рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рд▓реЗрдЦ рдПрдХ рд╕рд░рд▓ рдФрд░ рдХрдо рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧрд╛, рдЬреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╕рдм рд╕рдорд╛рди рдЖрд░рд╛рдо рдХреЗ рд╕рд╛рде рджреЗрддрд╛ рд╣реИред
  3. рдкреЛрд░реНрдЯрд┐рдВрдЧред рдкрд┐рдЫрд▓реЗ рдорд╛рдорд▓реЛрдВ рдХреА рддрд░рд╣, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЙрдкрдпреБрдХреНрддрддрд╛ - рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ - рдЗрд╕рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрддреБрд▓рди рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдиреЗрдЯрдЯреВрд▓ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЗ рдиреБрдХрд╕рд╛рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН: рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛрдб рдХреА рдХрд╛рдлреА рдорд╛рддреНрд░рд╛ рдХреЗ рдХрд╛рд░рдг, рдЖрдкрдХреЛ рдХреБрдЫ рдмрд╣реБрдд рдЧрдВрднреАрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕рдорд╛рдирддрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП), рдФрд░ рд╕рдордп-рд╕рдордп рдкрд░, рдкреЛрд░реНрдЯреЗрдмрд▓ рдПрдХ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдХрд╛рд░рдг, рдбреЗрд▓реНрдлреА рдореЗрдВ рд╕реБрдзрд╛рд░ рдФрд░ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

DLL


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╛рдардХ рдХреЛ рдЕрдВрддрд░ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, 2 рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬреЛ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВред

"рдХреНрд▓рд╛рд╕рд┐рдХ" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЖрдЗрдП рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдмрд╣реБрдд рд╣реА рдкреНрд░рдХреГрддрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рдЗрдВрдЯрд░рдиреЗрдЯрдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬреЛ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ; рд╣рдо WinAPI рдХреЗ рд╕рдорд╛рди DLL рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрдирд╛рдПрдВрдЧреЗ, рдЬрдм рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд╕рд╛рдзрди рдХрд╛ рд╣реИрдВрдбрд▓ рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдореА рд╣реИрдВрдбрд▓ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдмрдВрдж)ред рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╣рд░ рдЪреАрдЬ рдореЗрдВ рдПрдХ рд░реЛрд▓ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреЗ рдмрд╛рдж - рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЧрд░реАрдм рд░рд┐рд╢реНрддреЗрджрд╛рд░ред

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ (рддреАрд░ рдирд┐рд░реНрднрд░рддрд╛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ):

"рдХреНрд▓рд╛рд╕рд┐рдХ" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛


InternetTools.Types рдореЙрдбреНрдпреВрд▓


рдЪреВрдВрдХрд┐ рджреЛрдиреЛрдВ рднрд╛рд╖рд╛рдПрдБ - рдбреЗрд▓реНрдлреА рдФрд░ рдлреНрд░реА рдкрд╛рд╕реНрдХрд▓ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЛ DLL рдирд┐рд░реНрдпрд╛рдд рд╕реВрдЪреА рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рд╣реА рдЙрдЪрд┐рдд рд╣реИ, рддрд╛рдХрд┐ рдЗрдВрдЯрд░рдиреЗрдЯрдЯреВрд▓рд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрдирдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рдирдХрд▓ рди рдХрд░реЗрдВред , рдЬрд┐рд╕рдореЗрдВ рдбрд╛рдпрдирд╛рдорд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

 unit InternetTools.Types; interface type TXQHandle = Integer; implementation end. 

рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд╢рдлреБрд▓ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдореЙрдбреНрдпреВрд▓ "рдкрд░рд┐рдкрдХреНрд╡" рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдирд┐рд░реНрд╡рд┐рд╡рд╛рдж рд╣реЛ рдЬрд╛рдПрдЧреАред

InternetTools рдбрд╛рдпрдирд╛рдорд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА


рдбреАрдПрд▓рдПрд▓ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдиреНрдпреВрдирддрдо рдЪрдпрдирд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░реНрдп рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:

 library InternetTools; uses InternetTools.Types; function OpenDocument(const URL: WideString): TXQHandle; stdcall; begin ... end; procedure CloseHandle(const Handle: TXQHandle); stdcall; begin ... end; function Map(const Handle: TXQHandle; const XQuery: WideString): TXQHandle; stdcall; begin ... end; function Count(const Handle: TXQHandle): Integer; stdcall; begin ... end; function ValueByIndex(const Handle: TXQHandle; const Index: Integer): WideString; stdcall; begin ... end; exports OpenDocument, CloseHandle, Map, Count, ValueByIndex; begin end. 

рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдбреЗрдореЛ рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг, рдкреВрд░реНрдг рдХреЛрдб рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рд░рд▓рддрдо рдПрдкреАрдЖрдИ рдХреЛ рдмрд╛рдж рдореЗрдВ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЬреЛ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдХреБрдЫ рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

InternetToolsUsage рдЕрдиреБрдкреНрд░рдпреЛрдЧ


рдкрд┐рдЫрд▓реА рддреИрдпрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдбреЗрд▓реНрдлреА рдореЗрдВ рд╕реВрдЪреА рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛:

 program InternetToolsUsage; ... uses InternetTools.Types; const DLLName = 'InternetTools.dll'; function OpenDocument(const URL: WideString): TXQHandle; stdcall; external DLLName; procedure CloseHandle(const Handle: TXQHandle); stdcall; external DLLName; function Map(const Handle: TXQHandle; const XQuery: WideString): TXQHandle; stdcall; external DLLName; function Count(const Handle: TXQHandle): Integer; stdcall; external DLLName; function ValueByIndex(const Handle: TXQHandle; const Index: Integer): WideString; stdcall; external DLLName; const ArticleURL = 'https://habr.com/post/415617'; ListXPath = '//div[@class="post__body post__body_full"]//li[a]'; var RootHandle, ListHandle: TXQHandle; I: Integer; begin RootHandle := OpenDocument(ArticleURL); try ListHandle := Map(RootHandle, ListXPath); try for I := 0 to Count(ListHandle) - 1 do Writeln( ValueByIndex(ListHandle, I) ); finally CloseHandle(ListHandle); end; finally CloseHandle(RootHandle); end; ReadLn; end. 

рдпрджрд┐ рдЖрдк рдбрд╛рдпрдирд╛рдорд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗ рдХрд┐ рдХреЛрдб рдирд┐: рд╢реБрд▓реНрдХ рдкрд╛рд╕реНрдХрд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рднрд╛рд░реА рд░реВрдк рд╕реЗ рднрд╛рд░реА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдХрд╛рд░реНрдп рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рддрддреНрд╡реЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдФрд░ рд▓рд┐рдВрдХ рдкрддреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╢реЗрд╖:

 uses xquery; const ArticleURL = 'https://habr.com/post/415617'; ListXPath = '//div[@class="post__body post__body_full"]//li[a]'; HrefXPath = './a/@href'; var ListValue, HrefValue: IXQValue; begin for ListValue in xqvalue(ArticleURL).retrieve.map(ListXPath) do if {   } then for HrefValue in ListValue.map(HrefXPath) do Writeln(HrefValue.toString); end. 

рд╡рд░реНрддрдорд╛рди рдПрдкреАрдЖрдИ рдбреАрдПрд▓рдПрд▓ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдореА рдХреА рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ, рдЬреЛ рди рдХреЗрд╡рд▓ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдХрдо рдХрд░рддреА рд╣реИ, рдмрд▓реНрдХрд┐ (рдФрд░ рдХреЛрдИ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг) рдЗрд╕реЗ рдКрдкрд░ рд╕реЗ рджреВрд░ рдирд╣реАрдВ рд▓реЗ рдЬрд╛рддреА рд╣реИ:

 program InternetToolsUsage; ... const ArticleURL = 'https://habr.com/post/415617'; ListXPath = '//div[@class="post__body post__body_full"]//li[a]'; HrefXPath = './a/@href'; var RootHandle, ListHandle, HrefHandle: TXQHandle; I, J: Integer; begin RootHandle := OpenDocument(ArticleURL); try ListHandle := Map(RootHandle, ListXPath); try for I := 0 to Count(ListHandle) - 1 do if {   } then begin HrefHandle := Map(ListHandle, HrefXPath); try for J := 0 to Count(HrefHandle) - 1 do Writeln( ValueByIndex(HrefHandle, J) ); finally CloseHandle(HrefHandle); end; end; finally CloseHandle(ListHandle); end; finally CloseHandle(RootHandle); end; ReadLn; end. 

рдЬрд╛рд╣рд┐рд░ рд╣реИ - рд╡рд╛рд╕реНрддрд╡рд┐рдХ, рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд▓реЗрдЦрди рдХреА рдорд╛рддреНрд░рд╛ рдХреЗрд╡рд▓ рддреЗрдЬреА рд╕реЗ рдмрдврд╝реЗрдЧреА, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдРрд╕реЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ рдЬреЛ рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдореБрдХреНрдд рд╣реИред

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╢реИрд▓реА, рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреА рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдХрдорд┐рдпрд╛рдВ рд╣реИрдВред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ DLL рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╛рдкреНрдд рдФрд░ рд▓реМрдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░), рдЖрдк InternetTools рдХреЗ рд╕рд╛рде рдЙрд╕реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд╛ рдЖрдпреЛрдЬрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдлреНрд░реА рдкрд╛рд╕реНрдХрд▓ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордпред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдШреЛрд╖рдгрд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ:

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛

рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рд╣рдо рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред

InternetTools.Types рдореЙрдбреНрдпреВрд▓


рдбреАрдПрд▓рдПрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ:

 unit InternetTools.Types; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface type IXQValue = interface; IXQValueEnumerator = interface ['{781B23DC-E8E8-4490-97EE-2332B3736466}'] function MoveNext: Boolean; safecall; function GetCurrent: IXQValue; safecall; property Current: IXQValue read GetCurrent; end; IXQValue = interface ['{DCE33144-A75F-4C53-8D25-6D9BD78B91E4}'] function GetEnumerator: IXQValueEnumerator; safecall; function OpenURL(const URL: WideString): IXQValue; safecall; function Map(const XQuery: WideString): IXQValue; safecall; function ToString: WideString; safecall; end; implementation end. }'] unit InternetTools.Types; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface type IXQValue = interface; IXQValueEnumerator = interface ['{781B23DC-E8E8-4490-97EE-2332B3736466}'] function MoveNext: Boolean; safecall; function GetCurrent: IXQValue; safecall; property Current: IXQValue read GetCurrent; end; IXQValue = interface ['{DCE33144-A75F-4C53-8D25-6D9BD78B91E4}'] function GetEnumerator: IXQValueEnumerator; safecall; function OpenURL(const URL: WideString): IXQValue; safecall; function Map(const XQuery: WideString): IXQValue; safecall; function ToString: WideString; safecall; end; implementation end. }'] unit InternetTools.Types; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface type IXQValue = interface; IXQValueEnumerator = interface ['{781B23DC-E8E8-4490-97EE-2332B3736466}'] function MoveNext: Boolean; safecall; function GetCurrent: IXQValue; safecall; property Current: IXQValue read GetCurrent; end; IXQValue = interface ['{DCE33144-A75F-4C53-8D25-6D9BD78B91E4}'] function GetEnumerator: IXQValueEnumerator; safecall; function OpenURL(const URL: WideString): IXQValue; safecall; function Map(const XQuery: WideString): IXQValue; safecall; function ToString: WideString; safecall; end; implementation end. 

рдбреЗрд▓реНрдлреА рдФрд░ рдПрдлрдкреАрд╕реА-рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рджреЛрдиреЛрдВ рдореЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рд╕рд╢рд░реНрдд рд╕рдВрдХрд▓рди рдирд┐рд░реНрджреЗрд╢ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред

IXQValueEnumerator рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП " for ... in ... " рдлрд╝реЙрд░реНрдо рдХреЗ рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП , рдЖрдк рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ; рджреВрд╕рд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореБрдЦреНрдп рд╣реИ рдФрд░ InternetTools рд╕реЗ IXQValue рдкрд░ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд░реИрдкрд░ рд╣реИ (рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕реА рдирд╛рдо рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХреЗ рдбреЗрд▓реНрдлреА рдХреЛрдб рдХреЛ рдлреНрд░реА рдкрд╛рд╕реНрдХрд▓ рдкрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рд╣рд╕рдВрдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХреЗ)ред рдпрджрд┐ рд╣рдо рдореЙрдбреНрдпреВрд▓ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдорд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдореЗрдВ рдШреЛрд╖рд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдПрдбреЗрдкреНрдЯрд░ рд╣реИрдВ , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде - рдЙрдирдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред

рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП safecall рдХреЙрд▓ рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдпрд╣рд╛рдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ ред "рджреЗрд╢реА" рддрд╛рд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп WideString рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдмрд╛рдзреНрдпрддрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдбреАрдПрд▓рдПрд▓ рдХреЗ рд╕рд╛рде рдЧрддрд┐рд╢реАрд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд╛ рд╡рд┐рд╖рдп рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред

InternetTools.Realization рдореЙрдбреНрдпреВрд▓


рдорд╣рддреНрд╡ рдФрд░ рдорд╛рддреНрд░рд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд╣рд▓рд╛ - рдпрд╣ рд╡рд╣ рд╣реИ, рдЬреЛ рд╢реАрд░реНрд╖рдХ рдореЗрдВ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛: рдЙрди рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ TXQValue рд╡рд░реНрдЧ рдХреЛ TXQValue , рдЬрд┐рдирдореЗрдВ рд╕реЗ рддрд░реАрдХреЗ рдЗрддрдиреЗ рд╕рд░рд▓ рд╣реИрдВ рдХрд┐ рд▓рдЧрднрдЧ рд╕рднреА рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ (рдпрд╣ рдХрд╛рдлреА рд╣реИред рдЙрдореНрдореАрдж рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ - рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ):

 unit InternetTools.Realization; {$MODE Delphi} interface uses xquery, InternetTools.Types; type IOriginalXQValue = xquery.IXQValue; TXQValue = class(TInterfacedObject, IXQValue, IXQValueEnumerator) private FOriginalXQValue: IOriginalXQValue; FEnumerator: TXQValueEnumerator; function MoveNext: Boolean; safecall; function GetCurrent: IXQValue; safecall; function GetEnumerator: IXQValueEnumerator; safecall; function OpenURL(const URL: WideString): IXQValue; safecall; function Map(const XQuery: WideString): IXQValue; safecall; function ToString: WideString; safecall; reintroduce; public constructor Create(const OriginalXQValue: IOriginalXQValue); overload; function SafeCallException(ExceptObject: TObject; ExceptAddr: CodePointer): HResult; override; end; implementation uses sysutils, comobj, w32internetaccess; function TXQValue.MoveNext: Boolean; begin Result := FEnumerator.MoveNext; end; function TXQValue.GetCurrent: IXQValue; begin Result := TXQValue.Create(FEnumerator.Current); end; function TXQValue.GetEnumerator: IXQValueEnumerator; begin FEnumerator := FOriginalXQValue.GetEnumerator; Result := Self; end; function TXQValue.OpenURL(const URL: WideString): IXQValue; begin FOriginalXQValue := xqvalue(URL).retrieve; Result := Self; end; function TXQValue.Map(const XQuery: WideString): IXQValue; begin Result := TXQValue.Create( FOriginalXQValue.map(XQuery) ); end; function TXQValue.ToString: WideString; begin Result := FOriginalXQValue.toJoinedString(LineEnding); end; constructor TXQValue.Create(const OriginalXQValue: IOriginalXQValue); begin FOriginalXQValue := OriginalXQValue; end; function TXQValue.SafeCallException(ExceptObject: TObject; ExceptAddr: CodePointer): HResult; begin Result := HandleSafeCallException(ExceptObject, ExceptAddr, GUID_NULL, ExceptObject.ClassName, ''); end; end. 

рдпрд╣ SafeCallException рдкрджреНрдзрддрд┐ рдкрд░ рд░реЛрдХ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ - рдЗрд╕рдХреА рдЕрд╡рд░реЛрдзрди, рджреНрд╡рд╛рд░рд╛ рдФрд░ рдмрдбрд╝реА, рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ ( TXQValue рдкреНрд░рджрд░реНрд╢рди TXQValue рдмрд┐рдирд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛), рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдбреЗрд▓реНрдлреА рдкрдХреНрд╖ рдХреЗ рдЕрдкрд╡рд╛рдж рдкрд╛рда рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ (рд╡рд┐рд╡рд░рдг) рдореЗрдВ рд╣реЛрдЧрд╛ рдлрд┐рд░ рд╕реЗ, рдПрдХ рд╣рд╛рд▓рд┐рдпрд╛ рд▓реЗрдЦ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

рдпрд╣ рд╕рдорд╛рдзрд╛рди, рд╕рдм рдХреБрдЫ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдзрд╛рдЧрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ - рдмрд╢рд░реНрддреЗ рдХрд┐ IXQValue рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, OpenURL рдорд╛рдзреНрдпрдо рд╕реЗ, рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рдкреНрд░реЗрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реБрд░рдХреНрд╖рд┐рдд рдЗрдВрдЯрд░рдиреЗрдЯрдЯрд▓реНрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред

InternetTools рдбрд╛рдпрдирд╛рдорд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА


рдЙрдкрд░реЛрдХреНрдд рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдХреЗ рдХрд╛рд░рдг, рдпрд╣ DLL рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ (рдЙрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛):

 library InternetTools; uses InternetTools.Types, InternetTools.Realization; function GetXQValue: IXQValue; stdcall; begin Result := TXQValue.Create; end; exports GetXQValue; begin SetMultiByteConversionCodePage(CP_UTF8); end. 

SetMultiByteConversionCodePage рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЛ рдареАрдХ рд╕реЗ рдпреВрдирд┐рдХреЛрдб рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

InternetToolsUsage рдЕрдиреБрдкреНрд░рдпреЛрдЧ


рдпрджрд┐ рдЕрдм рд╣рдо рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдбреЗрд▓реНрдлреА рд╕рдорд╛рдзрд╛рди рдХреЛ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдирд┐: рд╢реБрд▓реНрдХ рдкрд╛рд╕реНрдХрд▓ рдкрд░ рд╢рд╛рдпрдж рд╣реА рдЕрд▓рдЧ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 program InternetToolsUsage; ... uses System.Win.ComObj, InternetTools.Types; const DLLName = 'InternetTools.dll'; function GetXQValue: IXQValue; stdcall; external DLLName; const ArticleURL = 'https://habr.com/post/415617'; ListXPath = '//div[@class="post__body post__body_full"]//li[a]'; var ListValue: IXQValue; begin for ListValue in GetXQValue.OpenURL(ArticleURL).Map(ListXPath) do Writeln(ListValue.ToString); ReadLn; end. 

System.Win.ComObj рдореЙрдбреНрдпреВрд▓ рдЧрд▓рддреА рд╕реЗ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ - рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рд╕рднреА рд╕реЗрдлрд╝рдХреЙрд▓ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдкрд╛рда рдПрдХ рдореБрдЦрд░ "рд╕реЗрдлрд╝рдХреЙрд▓ рд╡рд┐рдзрд┐ рдореЗрдВ рдЕрдкрд╡рд╛рдж" рдмрди рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдбреАрдПрд▓рдПрд▓ рдореЗрдВ рдЙрддреНрдкрдиреНрди рдореВрд▓ рдореВрд▓реНрдпред

рдЗрд╕реА рддрд░рд╣ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг рдбреЗрд▓реНрдлреА рдкрд░ рдиреНрдпреВрдирддрдо рдорддрднреЗрдж рд╣реИрдВ:

 ... const ArticleURL = 'https://habr.com/post/415617'; ListXPath = '//div[@class="post__body post__body_full"]//li[a]'; HrefXPath = './a/@href'; var ListValue, HrefValue: IXQValue; begin for ListValue in GetXQValue.OpenURL(ArticleURL).Map(ListXPath) do if {   } then for HrefValue in ListValue.Map(HrefXPath) do Writeln(HrefValue.ToString); ReadLn; end. 

рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рд╢реЗрд╖ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛


рдпрджрд┐ рдЖрдк InternetTools рд╕реЗ IXQValue рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдкреВрд░реНрдг рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ InternetTools.Types рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдВрдкреВрд░реНрдг рд╕рдореГрджреНрдз рд╕реЗрдЯ рд╕реЗ рдХреЗрд╡рд▓ 2 рд╡рд┐рдзрд┐рдпрд╛рдБ ( Map рдФрд░ ToString ) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ; рдмрд╛рдХреА рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЬреЛ рдкрд╛рдардХ рдЕрдкрдиреЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рдордЭрддрд╛ рд╣реИ, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдФрд░ рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЗ рдЗрдВрдЯрд░рдиреЗрдЯрдЯреЗрд▓реНрд╕ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рдж рд╡реЗ рдЗрдВрдЯрд░рдиреЗрдЯрдЯреИрд▓рд╕ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреЛрдбрд╛рдВрддрд░рдг рдореЙрдбреНрдпреВрд▓ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ)ред

рдпрджрд┐ рдЖрдкрдХреЛ рдереЛрдбрд╝реА рдЕрд▓рдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдХреА рдкреНрд░рдмрдВрдзрди, рдЪрд░рдгреЛрдВ рдХрд╛ рдХреНрд░рдо рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ:

  1. InternetTools.Types рдореЗрдВ рдПрдХ рдирдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ InternetTools.Types рдЧрдпрд╛ InternetTools.Types :

     ... ICookies = interface ['{21D0CC9A-204D-44D2-AF00-98E9E04412CD}'] procedure Add(const URL, Name, Value: WideString); safecall; procedure Clear; safecall; end; ... -AF00-98E9E04412CD}'] ... ICookies = interface ['{21D0CC9A-204D-44D2-AF00-98E9E04412CD}'] procedure Add(const URL, Name, Value: WideString); safecall; procedure Clear; safecall; end; ... 
  2. рдлрд┐рд░ рдЗрд╕реЗ InternetTools.Realization рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

     ... type TCookies = class(TInterfacedObject, ICookies) private procedure Add(const URL, Name, Value: WideString); safecall; procedure Clear; safecall; public function SafeCallException(ExceptObject: TObject; ExceptAddr: CodePointer): HResult; override; end; ... implementation uses ..., internetaccess; ... procedure TCookies.Add(const URL, Name, Value: WideString); begin defaultInternet.cookies.setCookie( decodeURL(URL).host, decodeURL(URL).path, Name, Value, [] ); end; procedure TCookies.Clear; begin defaultInternet.cookies.clear; end; ... 
  3. рдЙрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдирдпрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдлрд╝рдВрдХреНрд╢рди DLL рдореЗрдВ рд▓реМрдЯрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

     ... function GetCookies: ICookies; stdcall; begin Result := TCookies.Create; end; exports ..., GetCookies; ... 

рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд░рд┐рд╣рд╛рдИ


рдпрджреНрдпрдкрд┐ рдЗрдВрдЯрд░рдиреЗрдЯрдЯреВрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЙрди рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИ рдЬреЛ рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛ - рдпрджрд┐ рдЖрдк рдЕрдЧрд▓рд╛ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рддреЗ рд╣реИрдВ (рдбреЗрд▓реНрдлреА рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдПрдлрдкреАрд╕реА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛), рдлрд┐рд░ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдПрдВрдЯрд░ рдХреБрдВрдЬреА рджрдмрд╛рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЦрдкрдд рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдмрдврд╝реЗрдЧреА:

 ... const ArticleURL = 'https://habr.com/post/415617'; TitleXPath = '//head/title'; var I: Integer; begin for I := 1 to 100 do begin Writeln( GetXQValue.OpenURL(ArticleURL).Map(TitleXPath).ToString ); Readln; end; end. 

рдпрд╣рд╛рдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ InternetTools рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЖрд╡рдВрдЯрд┐рдд рдЕрдкрдиреЗ рдЖрдВрддрд░рд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ( OpenURL рд╡рд┐рдзрд┐ рдореЗрдВ) - рдЗрд╕реЗ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП; рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, xquery рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЙрдбреНрдпреВрд▓ freeThreadVars рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдбреЗрд▓реНрдлреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдХреЙрд▓ рдХреЛ DLL рдирд┐рд░реНрдпрд╛рдд рд╕реВрдЪреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдХреЗ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 ... procedure FreeResources; stdcall; begin freeThreadVars; end; exports ..., FreeResources; ... 

рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рдж, рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдиреБрдХрд╕рд╛рди рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛:

 for I := 1 to 100 do begin Writeln( GetXQValue.OpenURL(ArticleURL).Map(TitleXPath).ToString ); FreeResources; Readln; end; 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ - FreeResources рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдЕрд░реНрдерд╣реАрди рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рднреА рдкреНрд░рдпрд╛рд╕ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред

Source: https://habr.com/ru/post/hi415617/


All Articles