├── .gitignore ├── HTML.Parser.pas ├── README.md ├── demo ├── DemoParser.dpr ├── DemoParser.dproj ├── DemoParser.dproj.local ├── DemoParser.identcache ├── DemoParser.res ├── Parse.png ├── Win32 │ └── Debug │ │ ├── DemoParser.exe │ │ └── Lotto.html ├── Xpath.png ├── main.dfm ├── main.pas └── ssl │ ├── libeay32.dll │ └── ssleay32.dll └── test ├── DemoParserTests.res ├── ParserTests.dpr ├── ParserTests.dproj ├── ParserTests.dproj.local ├── ParserTests.identcache ├── ParserTests.res ├── Testparser.pas ├── Win32 └── Debug │ ├── dunit.ini │ └── test.html └── test.html /.gitignore: -------------------------------------------------------------------------------- 1 | # Uncomment these types if you want even more clean repository. But be careful. 2 | # It can make harm to an existing project source. Read explanations below. 3 | # 4 | # Resource files are binaries containing manifest, project icon and version info. 5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. 6 | #*.res 7 | # 8 | # Type library file (binary). In old Delphi versions it should be stored. 9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored. 10 | #*.tlb 11 | # 12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7. 13 | # Uncomment this if you are not using diagrams or use newer Delphi version. 14 | #*.ddp 15 | # 16 | # Visual LiveBindings file. Added in Delphi XE2. 17 | # Uncomment this if you are not using LiveBindings Designer. 18 | #*.vlb 19 | # 20 | # Deployment Manager configuration file for your project. Added in Delphi XE2. 21 | # Uncomment this if it is not mobile development and you do not use remote debug feature. 22 | #*.deployproj 23 | # 24 | # C++ object files produced when C/C++ Output file generation is configured. 25 | # Uncomment this if you are not using external objects (zlib library for example). 26 | #*.obj 27 | # 28 | 29 | # Delphi compiler-generated binaries (safe to delete) 30 | *.exe 31 | *.dll 32 | *.bpl 33 | *.bpi 34 | *.dcp 35 | *.so 36 | *.apk 37 | *.drc 38 | *.map 39 | *.dres 40 | *.rsm 41 | *.tds 42 | *.dcu 43 | *.lib 44 | *.a 45 | *.o 46 | *.ocx 47 | 48 | # Delphi autogenerated files (duplicated info) 49 | *.cfg 50 | *.hpp 51 | *Resource.rc 52 | 53 | # Delphi local files (user-specific info) 54 | *.local 55 | *.identcache 56 | *.projdata 57 | *.tvsconfig 58 | *.dsk 59 | 60 | # Delphi history and backups 61 | __history/ 62 | __recovery/ 63 | *.~* 64 | 65 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi) 66 | *.stat 67 | 68 | # Boss dependency manager vendor folder https://github.com/HashLoad/boss 69 | modules/ 70 | -------------------------------------------------------------------------------- /HTML.Parser.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HemulGM/HTML-Parser/1f0b751e6c4fba4d882e8e19269dff0e586f3230/HTML.Parser.pas -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Delphi HTML Parser 3 | description: It is very small and fast module for parsing HTML pages. 4 | author: sandbil 5 | tags: delphi, Lasarus 6 | 7 | --- 8 | Delphi HTML Parser 9 | ========= 10 | This module lets you working with HTML documents as DOM tree and use XPath for searching tags. 11 | It is very simple way to parse HTML. 12 | 13 | 14 | 15 | This tested with version Delphi XE5,6 16 | 17 | ## Requirements 18 | OpenSSL 19 | (Demo project contains two required dll: libeay32.dll, ssleay32.dll) 20 | 21 | 22 | 23 | ## Usage 24 | 25 | Add in Uses parser.pas; 26 | Next: 27 | 28 | .. 29 | var 30 | DomTree: TDomTree; 31 | DomTreeNode: TDomTreeNode; 32 | HtmlTxt: string; 33 | NodeList:TNodeList; 34 | ValueList:TStringList; 35 | begin 36 | HtmlTxt:= 37 | NodeList:= TNodeList.Create; 38 | ValueList:= TStringList.Create; 39 | 40 | DomTree:= TDomTree.Create; 41 | DomTreeNode:= DomTree.RootNode; 42 | If DomTreeNode.RunParse(HtmlTxt) then 43 | begin 44 | {your code 45 | example: 46 | DomTreeNode.FindXPath('//*[@id="TopBox"]/div[1]/div[@class="draw default"]'),NodeList,ValueList)} 47 | .. 48 | end; 49 | .. 50 | end; 51 | 52 | And joy!!! 53 | 54 | Available properties and methods: 55 | TDomTree 56 | * property Count - count of nodes 57 | * property RootNode - root node (TDomTreeNode) 58 | * property ParseErr - Tstringlist contains all parsing errors and warnings 59 | 60 | TDomTreeNode 61 | * property Tag - name of tag 62 | * property AttributesTxt - string with all attributtes 63 | * property Attributes - parsed attributes (TDictionary) 64 | * property Text - text 65 | * property TypeTag - 66 | * property Child - contains child's nodes (TChildList of TDomTreeNode) 67 | * property Parent - contains parent's node 68 | * property Owner - contains pointer to owner TDomTree 69 | * function FindNode - boolean function, if true then TNodeList contains found nodes 70 | * function FindTagOfIndex - boolean function, if true then TNodeList contains founded nodes 71 | * function GetAttrValue - returns value of attribute of current node 72 | * function GetComment - returns the set index comment in the current container node 73 | * function GetTagName - return name of tag + AttributesTxt 74 | * function GetText - returns the set index text in the current container node 75 | * function GetXPath - returns Xpath for current node 76 | * function RunParse - if parse is successfully then CHild property contains HTML DOM tree 77 | * function FindXPath - boolean function, if true then TNodeList contains found nodes 78 | * and TStringList contains found values of attribute, comment, text 79 | 80 | Xpath support: 81 | * attributes - //*[@id="TopBox"]/div/@class 82 | * comment - //*[@id="TopBox"]/div/comment()[3] 83 | * text - //*[@id="TopBox"]/div/text()[2] 84 | * previous level - /../div[@class="draw default"]/img[2]/@alt 85 | 86 | * partial coincidence by search in value of attribute: 87 | /div[@class="draw] returned nodes [[div class="draw default"],[div class="draw"], [div class="draw any"]..] 88 | like Xpath's function contains. 89 | Note: Xpath always starts search from current node. If you want to do global search, you must start from root's node. 90 | 91 | See demo project. 92 | 93 | 94 | [![screenshot1](/demo/Parse.png)](/demo/Parse.png) 95 | [![screenshot2](/demo/Xpath.png)](/Xpath.png) 96 | -------------------------------------------------------------------------------- /demo/DemoParser.dpr: -------------------------------------------------------------------------------- 1 | program DemoParser; 2 | 3 | uses 4 | Vcl.Forms, 5 | main in 'main.pas' {Form1}, 6 | HTML.Parser in '..\HTML.Parser.pas'; 7 | 8 | {$R *.res} 9 | 10 | begin 11 | Application.Initialize; 12 | Application.MainFormOnTaskbar := True; 13 | Application.CreateForm(TForm1, Form1); 14 | Application.Run; 15 | 16 | end. 17 | -------------------------------------------------------------------------------- /demo/DemoParser.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {8F70B988-B08B-45CD-B86D-07E9F1BCF376} 4 | 18.8 5 | VCL 6 | DemoParser.dpr 7 | True 8 | Debug 9 | Win32 10 | 1 11 | Application 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Cfg_1 34 | true 35 | true 36 | 37 | 38 | true 39 | Base 40 | true 41 | 42 | 43 | $(BDS)\bin\delphi_PROJECTICON.ico 44 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) 45 | DemoParser 46 | .\$(Platform)\$(Config) 47 | .\$(Platform)\$(Config) 48 | false 49 | false 50 | false 51 | false 52 | false 53 | 54 | 55 | $(BDS)\bin\default_app.manifest 56 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 57 | true 58 | CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) 59 | 1033 60 | FireDACSqliteDriver;FireDACDSDriver;DBXSqliteDriver;FireDACPgDriver;fmx;IndySystem;TeeDB;tethering;inetdbbde;vclib;DBXInterBaseDriver;DataSnapClient;DataSnapServer;DataSnapCommon;DataSnapProviderClient;DBXSybaseASEDriver;DbxCommonDriver;vclimg;dbxcds;DatasnapConnectorsFreePascal;MetropolisUILiveTile;vcldb;vcldsnap;fmxFireDAC;DBXDb2Driver;DBXOracleDriver;CustomIPTransport;vclribbon;dsnap;IndyIPServer;fmxase;vcl;IndyCore;DBXMSSQLDriver;IndyIPCommon;CloudService;FmxTeeUI;FireDACIBDriver;CodeSiteExpressPkg;DataSnapFireDAC;FireDACDBXDriver;soapserver;inetdbxpress;dsnapxml;FireDACInfxDriver;FireDACDb2Driver;adortl;FireDACASADriver;bindcompfmx;vcldbx;FireDACODBCDriver;RESTBackendComponents;rtl;dbrtl;DbxClientDriver;FireDACCommon;bindcomp;inetdb;Tee;DBXOdbcDriver;vclFireDAC;xmlrtl;DataSnapNativeClient;svnui;ibxpress;IndyProtocols;DBXMySQLDriver;FireDACCommonDriver;bindengine;vclactnband;bindcompdbx;soaprtl;FMXTee;TeeUI;bindcompvcl;vclie;FireDACADSDriver;vcltouch;VclSmp;FireDACMSSQLDriver;FireDAC;DBXInformixDriver;Intraweb;VCLRESTComponents;DataSnapConnectors;DataSnapServerMidas;dsnapcon;DBXFirebirdDriver;inet;fmxobj;FireDACMySQLDriver;soapmidas;vclx;svn;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;RESTComponents;bdertl;FireDACMSAccDriver;dbexpress;DataSnapIndy10ServerTransport;IndyIPClient;$(DCC_UsePackage) 61 | true 62 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 63 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 64 | 65 | 66 | FireDACSqliteDriver;FireDACDSDriver;DBXSqliteDriver;FireDACPgDriver;fmx;IndySystem;TeeDB;tethering;vclib;DBXInterBaseDriver;DataSnapClient;DataSnapServer;DataSnapCommon;DataSnapProviderClient;DBXSybaseASEDriver;DbxCommonDriver;vclimg;dbxcds;DatasnapConnectorsFreePascal;MetropolisUILiveTile;vcldb;vcldsnap;fmxFireDAC;DBXDb2Driver;DBXOracleDriver;CustomIPTransport;vclribbon;dsnap;IndyIPServer;fmxase;vcl;IndyCore;DBXMSSQLDriver;IndyIPCommon;CloudService;FmxTeeUI;FireDACIBDriver;DataSnapFireDAC;FireDACDBXDriver;soapserver;inetdbxpress;dsnapxml;FireDACInfxDriver;FireDACDb2Driver;adortl;FireDACASADriver;bindcompfmx;FireDACODBCDriver;RESTBackendComponents;rtl;dbrtl;DbxClientDriver;FireDACCommon;bindcomp;inetdb;Tee;DBXOdbcDriver;vclFireDAC;xmlrtl;DataSnapNativeClient;ibxpress;IndyProtocols;DBXMySQLDriver;FireDACCommonDriver;bindengine;vclactnband;bindcompdbx;soaprtl;FMXTee;TeeUI;bindcompvcl;vclie;FireDACADSDriver;vcltouch;VclSmp;FireDACMSSQLDriver;FireDAC;DBXInformixDriver;Intraweb;VCLRESTComponents;DataSnapConnectors;DataSnapServerMidas;dsnapcon;DBXFirebirdDriver;inet;fmxobj;FireDACMySQLDriver;soapmidas;vclx;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;RESTComponents;FireDACMSAccDriver;dbexpress;DataSnapIndy10ServerTransport;IndyIPClient;$(DCC_UsePackage) 67 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 68 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 69 | 70 | 71 | DEBUG;$(DCC_Define) 72 | true 73 | false 74 | true 75 | true 76 | true 77 | 78 | 79 | 2 80 | 3 81 | 2 82 | true 83 | CompanyName=;FileDescription=Parser;FileVersion=1.2.2.3;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName) 84 | 1033 85 | false 86 | Debug 87 | 88 | 89 | false 90 | RELEASE;$(DCC_Define) 91 | 0 92 | 0 93 | 94 | 95 | 96 | MainSource 97 | 98 | 99 |
Form1
100 | dfm 101 |
102 | 103 | 104 | Cfg_2 105 | Base 106 | 107 | 108 | Base 109 | 110 | 111 | Cfg_1 112 | Base 113 | 114 |
115 | 116 | Delphi.Personality.12 117 | 118 | 119 | 120 | 121 | DemoParser.dpr 122 | 123 | 124 | False 125 | False 126 | 1 127 | 0 128 | 0 129 | 0 130 | False 131 | False 132 | False 133 | False 134 | False 135 | 1049 136 | 1251 137 | 138 | 139 | 140 | 141 | 1.0.0.0 142 | 143 | 144 | 145 | 146 | 147 | 1.0.0.0 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | Embarcadero C++Builder Office 2000 Servers Package 175 | Embarcadero C++Builder Office XP Servers Package 176 | Microsoft Office 2000 Sample Automation Server Wrapper Components 177 | Microsoft Office XP Sample Automation Server Wrapper Components 178 | 179 | 180 | 181 | 182 | 183 | DemoParser.exe 184 | true 185 | 186 | 187 | 188 | 189 | 1 190 | 191 | 192 | Contents\MacOS 193 | 1 194 | 195 | 196 | 0 197 | 198 | 199 | 200 | 201 | classes 202 | 1 203 | 204 | 205 | classes 206 | 1 207 | 208 | 209 | 210 | 211 | res\xml 212 | 1 213 | 214 | 215 | res\xml 216 | 1 217 | 218 | 219 | 220 | 221 | library\lib\armeabi-v7a 222 | 1 223 | 224 | 225 | 226 | 227 | library\lib\armeabi 228 | 1 229 | 230 | 231 | library\lib\armeabi 232 | 1 233 | 234 | 235 | 236 | 237 | library\lib\armeabi-v7a 238 | 1 239 | 240 | 241 | 242 | 243 | library\lib\mips 244 | 1 245 | 246 | 247 | library\lib\mips 248 | 1 249 | 250 | 251 | 252 | 253 | library\lib\armeabi-v7a 254 | 1 255 | 256 | 257 | library\lib\arm64-v8a 258 | 1 259 | 260 | 261 | 262 | 263 | library\lib\armeabi-v7a 264 | 1 265 | 266 | 267 | 268 | 269 | res\drawable 270 | 1 271 | 272 | 273 | res\drawable 274 | 1 275 | 276 | 277 | 278 | 279 | res\values 280 | 1 281 | 282 | 283 | res\values 284 | 1 285 | 286 | 287 | 288 | 289 | res\values-v21 290 | 1 291 | 292 | 293 | res\values-v21 294 | 1 295 | 296 | 297 | 298 | 299 | res\values 300 | 1 301 | 302 | 303 | res\values 304 | 1 305 | 306 | 307 | 308 | 309 | res\drawable 310 | 1 311 | 312 | 313 | res\drawable 314 | 1 315 | 316 | 317 | 318 | 319 | res\drawable-xxhdpi 320 | 1 321 | 322 | 323 | res\drawable-xxhdpi 324 | 1 325 | 326 | 327 | 328 | 329 | res\drawable-ldpi 330 | 1 331 | 332 | 333 | res\drawable-ldpi 334 | 1 335 | 336 | 337 | 338 | 339 | res\drawable-mdpi 340 | 1 341 | 342 | 343 | res\drawable-mdpi 344 | 1 345 | 346 | 347 | 348 | 349 | res\drawable-hdpi 350 | 1 351 | 352 | 353 | res\drawable-hdpi 354 | 1 355 | 356 | 357 | 358 | 359 | res\drawable-xhdpi 360 | 1 361 | 362 | 363 | res\drawable-xhdpi 364 | 1 365 | 366 | 367 | 368 | 369 | res\drawable-mdpi 370 | 1 371 | 372 | 373 | res\drawable-mdpi 374 | 1 375 | 376 | 377 | 378 | 379 | res\drawable-hdpi 380 | 1 381 | 382 | 383 | res\drawable-hdpi 384 | 1 385 | 386 | 387 | 388 | 389 | res\drawable-xhdpi 390 | 1 391 | 392 | 393 | res\drawable-xhdpi 394 | 1 395 | 396 | 397 | 398 | 399 | res\drawable-xxhdpi 400 | 1 401 | 402 | 403 | res\drawable-xxhdpi 404 | 1 405 | 406 | 407 | 408 | 409 | res\drawable-xxxhdpi 410 | 1 411 | 412 | 413 | res\drawable-xxxhdpi 414 | 1 415 | 416 | 417 | 418 | 419 | res\drawable-small 420 | 1 421 | 422 | 423 | res\drawable-small 424 | 1 425 | 426 | 427 | 428 | 429 | res\drawable-normal 430 | 1 431 | 432 | 433 | res\drawable-normal 434 | 1 435 | 436 | 437 | 438 | 439 | res\drawable-large 440 | 1 441 | 442 | 443 | res\drawable-large 444 | 1 445 | 446 | 447 | 448 | 449 | res\drawable-xlarge 450 | 1 451 | 452 | 453 | res\drawable-xlarge 454 | 1 455 | 456 | 457 | 458 | 459 | res\values 460 | 1 461 | 462 | 463 | res\values 464 | 1 465 | 466 | 467 | 468 | 469 | 1 470 | 471 | 472 | Contents\MacOS 473 | 1 474 | 475 | 476 | 0 477 | 478 | 479 | 480 | 481 | Contents\MacOS 482 | 1 483 | .framework 484 | 485 | 486 | Contents\MacOS 487 | 1 488 | .framework 489 | 490 | 491 | 0 492 | 493 | 494 | 495 | 496 | 1 497 | .dylib 498 | 499 | 500 | 1 501 | .dylib 502 | 503 | 504 | 1 505 | .dylib 506 | 507 | 508 | Contents\MacOS 509 | 1 510 | .dylib 511 | 512 | 513 | Contents\MacOS 514 | 1 515 | .dylib 516 | 517 | 518 | 0 519 | .dll;.bpl 520 | 521 | 522 | 523 | 524 | 1 525 | .dylib 526 | 527 | 528 | 1 529 | .dylib 530 | 531 | 532 | 1 533 | .dylib 534 | 535 | 536 | Contents\MacOS 537 | 1 538 | .dylib 539 | 540 | 541 | Contents\MacOS 542 | 1 543 | .dylib 544 | 545 | 546 | 0 547 | .bpl 548 | 549 | 550 | 551 | 552 | 0 553 | 554 | 555 | 0 556 | 557 | 558 | 0 559 | 560 | 561 | 0 562 | 563 | 564 | 0 565 | 566 | 567 | Contents\Resources\StartUp\ 568 | 0 569 | 570 | 571 | Contents\Resources\StartUp\ 572 | 0 573 | 574 | 575 | 0 576 | 577 | 578 | 579 | 580 | 1 581 | 582 | 583 | 1 584 | 585 | 586 | 1 587 | 588 | 589 | 590 | 591 | 1 592 | 593 | 594 | 1 595 | 596 | 597 | 1 598 | 599 | 600 | 601 | 602 | 1 603 | 604 | 605 | 1 606 | 607 | 608 | 1 609 | 610 | 611 | 612 | 613 | 1 614 | 615 | 616 | 1 617 | 618 | 619 | 1 620 | 621 | 622 | 623 | 624 | 1 625 | 626 | 627 | 1 628 | 629 | 630 | 1 631 | 632 | 633 | 634 | 635 | 1 636 | 637 | 638 | 1 639 | 640 | 641 | 1 642 | 643 | 644 | 645 | 646 | 1 647 | 648 | 649 | 1 650 | 651 | 652 | 1 653 | 654 | 655 | 656 | 657 | 1 658 | 659 | 660 | 1 661 | 662 | 663 | 1 664 | 665 | 666 | 667 | 668 | 1 669 | 670 | 671 | 1 672 | 673 | 674 | 1 675 | 676 | 677 | 678 | 679 | 1 680 | 681 | 682 | 1 683 | 684 | 685 | 1 686 | 687 | 688 | 689 | 690 | 1 691 | 692 | 693 | 1 694 | 695 | 696 | 1 697 | 698 | 699 | 700 | 701 | 1 702 | 703 | 704 | 1 705 | 706 | 707 | 1 708 | 709 | 710 | 711 | 712 | 1 713 | 714 | 715 | 1 716 | 717 | 718 | 1 719 | 720 | 721 | 722 | 723 | 1 724 | 725 | 726 | 1 727 | 728 | 729 | 1 730 | 731 | 732 | 733 | 734 | 1 735 | 736 | 737 | 1 738 | 739 | 740 | 1 741 | 742 | 743 | 744 | 745 | 1 746 | 747 | 748 | 1 749 | 750 | 751 | 1 752 | 753 | 754 | 755 | 756 | 1 757 | 758 | 759 | 1 760 | 761 | 762 | 1 763 | 764 | 765 | 766 | 767 | 1 768 | 769 | 770 | 1 771 | 772 | 773 | 1 774 | 775 | 776 | 777 | 778 | 1 779 | 780 | 781 | 1 782 | 783 | 784 | 1 785 | 786 | 787 | 788 | 789 | 1 790 | 791 | 792 | 1 793 | 794 | 795 | 1 796 | 797 | 798 | 799 | 800 | 1 801 | 802 | 803 | 1 804 | 805 | 806 | 1 807 | 808 | 809 | 810 | 811 | 1 812 | 813 | 814 | 1 815 | 816 | 817 | 1 818 | 819 | 820 | 821 | 822 | 1 823 | 824 | 825 | 1 826 | 827 | 828 | 1 829 | 830 | 831 | 832 | 833 | 1 834 | 835 | 836 | 1 837 | 838 | 839 | 1 840 | 841 | 842 | 843 | 844 | 1 845 | 846 | 847 | 1 848 | 849 | 850 | 851 | 852 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 853 | 1 854 | 855 | 856 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 857 | 1 858 | 859 | 860 | 861 | 862 | 1 863 | 864 | 865 | 1 866 | 867 | 868 | 869 | 870 | ..\ 871 | 1 872 | 873 | 874 | ..\ 875 | 1 876 | 877 | 878 | 879 | 880 | 1 881 | 882 | 883 | 1 884 | 885 | 886 | 1 887 | 888 | 889 | 890 | 891 | 1 892 | 893 | 894 | 1 895 | 896 | 897 | 1 898 | 899 | 900 | 901 | 902 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 903 | 1 904 | 905 | 906 | 907 | 908 | ..\ 909 | 1 910 | 911 | 912 | ..\ 913 | 1 914 | 915 | 916 | 917 | 918 | Contents 919 | 1 920 | 921 | 922 | Contents 923 | 1 924 | 925 | 926 | 927 | 928 | Contents\Resources 929 | 1 930 | 931 | 932 | Contents\Resources 933 | 1 934 | 935 | 936 | 937 | 938 | library\lib\armeabi-v7a 939 | 1 940 | 941 | 942 | library\lib\arm64-v8a 943 | 1 944 | 945 | 946 | 1 947 | 948 | 949 | 1 950 | 951 | 952 | 1 953 | 954 | 955 | 1 956 | 957 | 958 | Contents\MacOS 959 | 1 960 | 961 | 962 | Contents\MacOS 963 | 1 964 | 965 | 966 | 0 967 | 968 | 969 | 970 | 971 | library\lib\armeabi-v7a 972 | 1 973 | 974 | 975 | 976 | 977 | 1 978 | 979 | 980 | 1 981 | 982 | 983 | 984 | 985 | Assets 986 | 1 987 | 988 | 989 | Assets 990 | 1 991 | 992 | 993 | 994 | 995 | Assets 996 | 1 997 | 998 | 999 | Assets 1000 | 1 1001 | 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | 1008 | 1009 | 1010 | 1011 | 1012 | 1013 | 1014 | 1015 | True 1016 | False 1017 | 1018 | False 1019 | 1020 | C:\!work\!Demo\DemoParser6\demo\Test\DemoParserTests.dproj 1021 | 1022 | 1023 | 12 1024 | 1025 | 1026 | 1027 | 1028 |
1029 | -------------------------------------------------------------------------------- /demo/DemoParser.dproj.local: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 1899.12.30 00:00:00.000.770,C:\Users\bil\Documents\Embarcadero\Studio\Projects\Project1.dproj=C:\Users\bil\Documents\Embarcadero\Studio\Projects\DemoParser.dproj 5 | 1899.12.30 00:00:00.000.641,=D:\Мультимедиа\Проекты\#Fork\HTML-Parser\demo\ModelSupport_DemoParser\DemoParser\default.txvpck 6 | 1899.12.30 00:00:00.000.290,=D:\Мультимедиа\Проекты\#Fork\HTML-Parser\demo\ModelSupport_DemoParser\default.txvpck 7 | 1899.12.30 00:00:00.000.447,=D:\Мультимедиа\Проекты\#Fork\HTML-Parser\demo\ModelSupport_DemoParser\parser\default.txvpck 8 | 1899.12.30 00:00:00.000.806,=C:\Users\bil\Documents\Embarcadero\Studio\Projects\ModelSupport_DemoParser\default.txaPackage 9 | 1899.12.30 00:00:00.000.609,C:\Users\bil\Documents\Embarcadero\Studio\Projects\Unit1.dfm=C:\Users\bil\Documents\Embarcadero\Studio\Projects\main.dfm 10 | 1899.12.30 00:00:00.000.326,=D:\Мультимедиа\Проекты\#Fork\HTML-Parser\demo\ModelSupport_DemoParser\main\default.txaPackage 11 | 1899.12.30 00:00:00.000.093,=C:\Users\bil\Documents\Embarcadero\Studio\Projects\ModelSupport_DemoParser\default.txvpck 12 | 1899.12.30 00:00:00.000.230,=C:\Users\bil\Documents\Embarcadero\Studio\Projects\ModelSupport_DemoParser\main\default.txvpck 13 | 1899.12.30 00:00:00.000.238,=D:\Мультимедиа\Проекты\#Fork\HTML-Parser\demo\ModelSupport_DemoParser\main\default.txvpck 14 | 1899.12.30 00:00:00.000.969,=C:\!work\delphi\DemoParser\parser.pas 15 | 1899.12.30 00:00:00.000.041,D:\Мультимедиа\Проекты\#Fork\HTML-Parser\HTML.Parser.pas=D:\Мультимедиа\Проекты\#Fork\HTML-Parser\parser.pas 16 | 1899.12.30 00:00:00.000.258,=C:\Users\bil\Documents\Embarcadero\Studio\Projects\ModelSupport_DemoParser\DemoParser\default.txvpck 17 | 1899.12.30 00:00:00.000.211,=C:\!work\!Demo\DemoParser\Unit1.pas 18 | 1899.12.30 00:00:00.000.302,C:\!work\!Demo\DemoParser\Unit1.pas= 19 | 1899.12.30 00:00:00.000.702,=C:\!work\delphi\DemoParser\Unit2.pas 20 | 1899.12.30 00:00:00.000.419,C:\!work\delphi\DemoParser\Unit2.pas=C:\!work\delphi\DemoParser\parser.pas 21 | 1899.12.30 00:00:00.000.219,=C:\!work\delphi\HTML-Parser\demo\ModelSupport_DemoParser\default.txaPackage 22 | 1899.12.30 00:00:00.000.511,=C:\Users\bil\Documents\Embarcadero\Studio\Projects\Unit1.pas 23 | 1899.12.30 00:00:00.000.586,C:\Users\bil\Documents\Embarcadero\Studio\Projects\Unit1.pas=C:\Users\bil\Documents\Embarcadero\Studio\Projects\main.pas 24 | 25 | 26 | -------------------------------------------------------------------------------- /demo/DemoParser.identcache: -------------------------------------------------------------------------------- 1 | HD:\Мультимедиа\Проекты\#Fork\HTML-Parser\demo\main.pasND:\Мультимедиа\Проекты\#Fork\HTML-Parser\demo\DemoParser.dprParserendRmainresuses 2 | CreateForminbeginVclTrueTForm1 3 | InitializeForm1Run 4 | DemoParserFormspasMainFormOnTaskbarHTMLprogram ApplicationJD:\Мультимедиа\Проекты\#Fork\HTML-Parser\HTML.Parser.pas -------------------------------------------------------------------------------- /demo/DemoParser.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HemulGM/HTML-Parser/1f0b751e6c4fba4d882e8e19269dff0e586f3230/demo/DemoParser.res -------------------------------------------------------------------------------- /demo/Parse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HemulGM/HTML-Parser/1f0b751e6c4fba4d882e8e19269dff0e586f3230/demo/Parse.png -------------------------------------------------------------------------------- /demo/Win32/Debug/DemoParser.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HemulGM/HTML-Parser/1f0b751e6c4fba4d882e8e19269dff0e586f3230/demo/Win32/Debug/DemoParser.exe -------------------------------------------------------------------------------- /demo/Xpath.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HemulGM/HTML-Parser/1f0b751e6c4fba4d882e8e19269dff0e586f3230/demo/Xpath.png -------------------------------------------------------------------------------- /demo/main.dfm: -------------------------------------------------------------------------------- 1 | object Form1: TForm1 2 | Left = 411 3 | Top = 0 4 | Caption = 'DemoParser' 5 | ClientHeight = 691 6 | ClientWidth = 998 7 | Color = clBtnFace 8 | Font.Charset = DEFAULT_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -11 11 | Font.Name = 'Tahoma' 12 | Font.Style = [] 13 | OldCreateOrder = False 14 | Position = poDesigned 15 | PixelsPerInch = 96 16 | TextHeight = 13 17 | object StatusBar1: TStatusBar 18 | Left = 0 19 | Top = 672 20 | Width = 998 21 | Height = 19 22 | Panels = < 23 | item 24 | Width = 250 25 | end 26 | item 27 | Width = 50 28 | end> 29 | end 30 | object PageControl1: TPageControl 31 | Left = 0 32 | Top = 0 33 | Width = 998 34 | Height = 672 35 | ActivePage = TabSheet1 36 | Align = alClient 37 | TabOrder = 1 38 | object TabSheet1: TTabSheet 39 | Caption = 'HTML Parser' 40 | OnShow = TabSheet1Show 41 | object Splitter1: TSplitter 42 | Left = 0 43 | Top = 560 44 | Width = 990 45 | Height = 3 46 | Cursor = crVSplit 47 | Align = alBottom 48 | ExplicitLeft = 1 49 | ExplicitTop = 61 50 | ExplicitWidth = 398 51 | end 52 | object Panel2: TPanel 53 | Left = 0 54 | Top = 563 55 | Width = 990 56 | Height = 81 57 | Align = alBottom 58 | TabOrder = 0 59 | object Memo1: TMemo 60 | Left = 1 61 | Top = 1 62 | Width = 988 63 | Height = 79 64 | Align = alClient 65 | BevelInner = bvNone 66 | Lines.Strings = ( 67 | '') 68 | ReadOnly = True 69 | ScrollBars = ssVertical 70 | TabOrder = 0 71 | end 72 | end 73 | object Panel1: TPanel 74 | Left = 0 75 | Top = 0 76 | Width = 990 77 | Height = 560 78 | Align = alClient 79 | TabOrder = 1 80 | object Panel4: TPanel 81 | Left = 1 82 | Top = 41 83 | Width = 988 84 | Height = 518 85 | Align = alClient 86 | Caption = 'Panel4' 87 | TabOrder = 0 88 | object TreeView1: TTreeView 89 | Left = 1 90 | Top = 1 91 | Width = 986 92 | Height = 516 93 | ParentCustomHint = False 94 | Align = alClient 95 | BevelInner = bvNone 96 | BorderStyle = bsNone 97 | DragMode = dmAutomatic 98 | Indent = 19 99 | MultiSelect = True 100 | ParentShowHint = False 101 | RightClickSelect = True 102 | ShowHint = False 103 | TabOrder = 0 104 | OnMouseUp = TreeView1MouseUp 105 | end 106 | end 107 | object Panel8: TPanel 108 | Left = 1 109 | Top = 1 110 | Width = 988 111 | Height = 40 112 | Align = alTop 113 | TabOrder = 1 114 | object ParseBt: TButton 115 | Left = 7 116 | Top = 5 117 | Width = 90 118 | Height = 25 119 | Caption = 'Parse' 120 | TabOrder = 0 121 | OnClick = ParseBtClick 122 | end 123 | object Edit1: TEdit 124 | Left = 106 125 | Top = 8 126 | Width = 759 127 | Height = 21 128 | TabOrder = 1 129 | Text = 'http://www.ozlotteries.com/lotto-results#' 130 | end 131 | end 132 | end 133 | end 134 | object XPath: TTabSheet 135 | Caption = 'miniXPath' 136 | ImageIndex = 1 137 | OnShow = XPathShow 138 | object Splitter3: TSplitter 139 | Left = 400 140 | Top = 40 141 | Height = 520 142 | AutoSnap = False 143 | ExplicitLeft = 704 144 | ExplicitTop = 512 145 | ExplicitHeight = 100 146 | end 147 | object Splitter4: TSplitter 148 | Left = 0 149 | Top = 560 150 | Width = 990 151 | Height = 3 152 | Cursor = crVSplit 153 | Align = alBottom 154 | ExplicitTop = 500 155 | ExplicitWidth = 906 156 | end 157 | object Panel5: TPanel 158 | Left = 0 159 | Top = 0 160 | Width = 990 161 | Height = 40 162 | Align = alTop 163 | TabOrder = 0 164 | object FindOneBt: TButton 165 | Left = 5 166 | Top = 5 167 | Width = 90 168 | Height = 25 169 | Caption = 'Find in DOM' 170 | TabOrder = 0 171 | OnClick = FindOneBtClick 172 | end 173 | object Edit2: TEdit 174 | Left = 105 175 | Top = 7 176 | Width = 760 177 | Height = 21 178 | TabOrder = 1 179 | Text = '//*[@id="TopBox"]/div/div/div/div/div[@class="draw default"]' 180 | end 181 | end 182 | object Panel6: TPanel 183 | Left = 0 184 | Top = 40 185 | Width = 400 186 | Height = 520 187 | Align = alLeft 188 | Caption = 'Panel6' 189 | TabOrder = 1 190 | end 191 | object Panel7: TPanel 192 | Left = 403 193 | Top = 40 194 | Width = 587 195 | Height = 520 196 | Align = alClient 197 | Caption = 'Panel7' 198 | TabOrder = 2 199 | object Splitter2: TSplitter 200 | Left = 1 201 | Top = 225 202 | Width = 585 203 | Height = 3 204 | Cursor = crVSplit 205 | Align = alTop 206 | ExplicitLeft = -23 207 | ExplicitTop = 17 208 | ExplicitWidth = 540 209 | end 210 | object Panel3: TPanel 211 | Left = 1 212 | Top = 1 213 | Width = 585 214 | Height = 224 215 | Align = alTop 216 | Caption = 'Panel3' 217 | TabOrder = 0 218 | object Panel9: TPanel 219 | Left = 1 220 | Top = 193 221 | Width = 583 222 | Height = 30 223 | Align = alBottom 224 | Color = clSkyBlue 225 | ParentBackground = False 226 | TabOrder = 0 227 | object ClearBt: TButton 228 | Left = 4 229 | Top = 3 230 | Width = 45 231 | Height = 25 232 | Caption = 'Clear' 233 | TabOrder = 0 234 | OnClick = ClearBtClick 235 | end 236 | object FindAllBt: TButton 237 | Left = 208 238 | Top = 3 239 | Width = 122 240 | Height = 25 241 | Caption = 'Find all result' 242 | TabOrder = 1 243 | OnClick = FindAllBtClick 244 | end 245 | object Button1: TButton 246 | Left = 55 247 | Top = 3 248 | Width = 58 249 | Height = 25 250 | Caption = 'Collapse' 251 | TabOrder = 2 252 | OnClick = Button1Click 253 | end 254 | object Button2: TButton 255 | Left = 106 256 | Top = 3 257 | Width = 55 258 | Height = 25 259 | Caption = 'Expand' 260 | TabOrder = 3 261 | OnClick = Button2Click 262 | end 263 | end 264 | object TreeView2: TTreeView 265 | Left = 1 266 | Top = 1 267 | Width = 583 268 | Height = 192 269 | Align = alClient 270 | Indent = 19 271 | TabOrder = 1 272 | OnDragDrop = TreeView2DragDrop 273 | OnDragOver = TreeView2DragOver 274 | OnEndDrag = TreeView2EndDrag 275 | Items.NodeData = { 276 | 0301000000B80000000000000000000000FFFFFFFFFFFFFFFF00000000000000 277 | 0002000000014D2F002F002A005B004000690064003D00220054006F00700042 278 | 006F00780022005D002F006400690076002F006400690076002F006400690076 279 | 002F006400690076005B00400063006C006100730073003D0022007200650073 280 | 0075006C0074005F0062006C006F0063006B005D002F006400690076005B0040 281 | 0063006C006100730073003D0022006E0075006D00620065007200730022005D 282 | 00960000000000000000000000FFFFFFFFFFFFFFFF0000000000000000000000 283 | 00013C2F002E002E002F006400690076005B00400063006C006100730073003D 284 | 00220064007200610077002000640065006600610075006C00740022005D002F 285 | 0061005B00400063006C006100730073003D0022006C006F00740074006F005F 286 | 006E0061006D00650022005D002F007400650078007400280029005000000000 287 | 00000000000000FFFFFFFFFFFFFFFF00000000000000000600000001192F002E 288 | 002E002F006400690076005B00400063006C006100730073003D0022006E0075 289 | 006D00620065007200730022005D006E0000000000000000000000FFFFFFFFFF 290 | FFFFFF00000000000000000000000001282F002E002E002F006400690076005B 291 | 00400063006C006100730073003D002200640072006100770020006400650066 292 | 00610075006C00740022005D002F007400650078007400280029005B0031005D 293 | 006E0000000000000000000000FFFFFFFFFFFFFFFF0000000000000000000000 294 | 0001282F002E002E002F006400690076005B00400063006C006100730073003D 295 | 00220064007200610077002000640065006600610075006C00740022005D002F 296 | 007400650078007400280029005B0032005D00540000000000000000000000FF 297 | FFFFFFFFFFFFFF000000000000000000000000011B2F007400610062006C0065 298 | 002F00740072005B0032005D002F00740064005B0031005D002F0069006D0067 299 | 002F00400061006C007400540000000000000000000000FFFFFFFFFFFFFFFF00 300 | 0000000000000000000000011B2F007400610062006C0065002F00740072005B 301 | 0032005D002F00740064005B0032005D002F0069006D0067002F00400061006C 302 | 0074007A0000000000000000000000FFFFFFFFFFFFFFFF000000000000000000 303 | 000000012E2F002E002E002F006400690076005B00400063006C006100730073 304 | 003D0022006400690076006900640065006E0064005F00770072006100700070 305 | 006500720022005D002F007300700061006E002F007400650078007400280029 306 | 00740000000000000000000000FFFFFFFFFFFFFFFF0000000000000000040000 307 | 00012B2F002E002E002F006400690076005B00400063006C006100730073003D 308 | 0022006400690076006900640065006E0064005F007700720061007000700065 309 | 00720022005D002F007400610062006C0065002F007400720046000000000000 310 | 0000000000FFFFFFFFFFFFFFFF00000000000000000000000001142F00740064 311 | 005B0031005D002F007300740072006F006E0067002F00740065007800740028 312 | 002900460000000000000000000000FFFFFFFFFFFFFFFF000000000000000000 313 | 00000001142F00740064005B0032005D002F007300740072006F006E0067002F 314 | 007400650078007400280029003E0000000000000000000000FFFFFFFFFFFFFF 315 | FF00000000000000000000000001102F00740064005B0032005D002F00740065 316 | 0078007400280029005B0031005D003E0000000000000000000000FFFFFFFFFF 317 | FFFFFF00000000000000000000000001102F00740064005B0032005D002F0074 318 | 00650078007400280029005B0032005D00} 319 | end 320 | end 321 | object TreeView3: TTreeView 322 | Left = 1 323 | Top = 228 324 | Width = 585 325 | Height = 291 326 | Align = alClient 327 | Indent = 19 328 | ReadOnly = True 329 | TabOrder = 1 330 | end 331 | end 332 | object Panel10: TPanel 333 | Left = 0 334 | Top = 563 335 | Width = 990 336 | Height = 81 337 | Align = alBottom 338 | Caption = 'Panel10' 339 | TabOrder = 3 340 | end 341 | end 342 | object TabSheet2: TTabSheet 343 | Caption = 'MultiTest parsing' 344 | ImageIndex = 2 345 | object Panel11: TPanel 346 | Left = 0 347 | Top = 0 348 | Width = 990 349 | Height = 644 350 | Align = alClient 351 | TabOrder = 0 352 | object Panel12: TPanel 353 | Left = 1 354 | Top = 41 355 | Width = 988 356 | Height = 602 357 | Align = alClient 358 | Caption = 'Panel4' 359 | TabOrder = 0 360 | object Memo2: TMemo 361 | Left = 1 362 | Top = 1 363 | Width = 986 364 | Height = 600 365 | Align = alClient 366 | ScrollBars = ssBoth 367 | TabOrder = 0 368 | end 369 | end 370 | object Panel13: TPanel 371 | Left = 1 372 | Top = 1 373 | Width = 988 374 | Height = 40 375 | Align = alTop 376 | TabOrder = 1 377 | object Button3: TButton 378 | Left = 7 379 | Top = 5 380 | Width = 90 381 | Height = 25 382 | Caption = 'Parse all link' 383 | TabOrder = 0 384 | OnClick = Button3Click 385 | end 386 | object Edit3: TEdit 387 | Left = 106 388 | Top = 8 389 | Width = 551 390 | Height = 21 391 | TabOrder = 1 392 | Text = 393 | 'https://www.google.ru/search?ie=UTF-8&hl=ru&q=delphi%20xpath&gws' + 394 | '_rd=ssl' 395 | end 396 | end 397 | end 398 | end 399 | end 400 | object IdHTTP1: TIdHTTP 401 | IOHandler = IdSSLIOHandlerSocketOpenSSL1 402 | AllowCookies = True 403 | ProxyParams.BasicAuthentication = False 404 | ProxyParams.ProxyPort = 0 405 | Request.ContentLength = -1 406 | Request.ContentRangeEnd = -1 407 | Request.ContentRangeStart = -1 408 | Request.ContentRangeInstanceLength = -1 409 | Request.Accept = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' 410 | Request.BasicAuthentication = False 411 | Request.UserAgent = 'Mozilla/3.0 (compatible; Indy Library)' 412 | Request.Ranges.Units = 'bytes' 413 | Request.Ranges = <> 414 | HTTPOptions = [hoForceEncodeParams] 415 | Left = 824 416 | Top = 72 417 | end 418 | object IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL 419 | MaxLineAction = maException 420 | Port = 0 421 | DefaultPort = 0 422 | SSLOptions.Mode = sslmUnassigned 423 | SSLOptions.VerifyMode = [] 424 | SSLOptions.VerifyDepth = 0 425 | Left = 824 426 | Top = 144 427 | end 428 | object IdHTTP2: TIdHTTP 429 | IOHandler = IdSSLIOHandlerSocketOpenSSL2 430 | AllowCookies = True 431 | ProxyParams.BasicAuthentication = False 432 | ProxyParams.ProxyPort = 0 433 | Request.ContentLength = -1 434 | Request.ContentRangeEnd = -1 435 | Request.ContentRangeStart = -1 436 | Request.ContentRangeInstanceLength = -1 437 | Request.Accept = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' 438 | Request.BasicAuthentication = False 439 | Request.UserAgent = 'Mozilla/3.0 (compatible; Indy Library)' 440 | Request.Ranges.Units = 'bytes' 441 | Request.Ranges = <> 442 | HTTPOptions = [hoForceEncodeParams] 443 | Left = 880 444 | Top = 72 445 | end 446 | object IdSSLIOHandlerSocketOpenSSL2: TIdSSLIOHandlerSocketOpenSSL 447 | MaxLineAction = maException 448 | Port = 0 449 | DefaultPort = 0 450 | SSLOptions.Mode = sslmUnassigned 451 | SSLOptions.VerifyMode = [] 452 | SSLOptions.VerifyDepth = 0 453 | Left = 880 454 | Top = 144 455 | end 456 | object HTTPClient1: TNetHTTPClient 457 | Asynchronous = False 458 | ConnectionTimeout = 60000 459 | ResponseTimeout = 60000 460 | HandleRedirects = True 461 | AllowCookies = True 462 | UserAgent = 'Embarcadero URI Client/1.0' 463 | Left = 589 464 | Top = 169 465 | end 466 | end 467 | -------------------------------------------------------------------------------- /demo/main.pas: -------------------------------------------------------------------------------- 1 | unit main; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, 7 | Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent, System.Contnrs, System.StrUtils, HTML.Parser, IdComponent, 8 | IdTCPConnection, IdTCPClient, IdHTTP, Vcl.ComCtrls, Vcl.ExtCtrls, Vcl.Buttons, IdIOHandler, IdIOHandlerSocket, 9 | IdIOHandlerStack, IdSSL, IdSSLOpenSSL, System.Net.URLClient, 10 | System.Net.HttpClient, System.Net.HttpClientComponent; 11 | 12 | type 13 | TForm1 = class(TForm) 14 | Memo1: TMemo; 15 | IdHTTP1: TIdHTTP; 16 | Edit1: TEdit; 17 | ParseBt: TButton; 18 | Panel1: TPanel; 19 | Panel2: TPanel; 20 | StatusBar1: TStatusBar; 21 | PageControl1: TPageControl; 22 | TabSheet1: TTabSheet; 23 | Splitter1: TSplitter; 24 | Panel4: TPanel; 25 | XPath: TTabSheet; 26 | Panel5: TPanel; 27 | Edit2: TEdit; 28 | FindOneBt: TButton; 29 | Panel6: TPanel; 30 | Splitter2: TSplitter; 31 | Panel7: TPanel; 32 | TreeView1: TTreeView; 33 | Panel8: TPanel; 34 | Panel3: TPanel; 35 | Splitter3: TSplitter; 36 | Panel9: TPanel; 37 | TreeView2: TTreeView; 38 | TreeView3: TTreeView; 39 | ClearBt: TButton; 40 | FindAllBt: TButton; 41 | Panel10: TPanel; 42 | Splitter4: TSplitter; 43 | Button1: TButton; 44 | Button2: TButton; 45 | IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL; 46 | TabSheet2: TTabSheet; 47 | Panel11: TPanel; 48 | Panel12: TPanel; 49 | Panel13: TPanel; 50 | Button3: TButton; 51 | Edit3: TEdit; 52 | Memo2: TMemo; 53 | IdHTTP2: TIdHTTP; 54 | IdSSLIOHandlerSocketOpenSSL2: TIdSSLIOHandlerSocketOpenSSL; 55 | HTTPClient1: TNetHTTPClient; 56 | procedure ParseBtClick(Sender: TObject); 57 | procedure TabSheet1Show(Sender: TObject); 58 | procedure XPathShow(Sender: TObject); 59 | procedure TreeView1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 60 | procedure TreeView2DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); 61 | procedure TreeView2DragDrop(Sender, Source: TObject; X, Y: Integer); 62 | procedure TreeView2EndDrag(Sender, Target: TObject; X, Y: Integer); 63 | procedure ClearBtClick(Sender: TObject); 64 | procedure FindAllBtClick(Sender: TObject); 65 | procedure FindOneBtClick(Sender: TObject); 66 | procedure Button1Click(Sender: TObject); 67 | procedure Button2Click(Sender: TObject); 68 | procedure Button3Click(Sender: TObject); 69 | private 70 | procedure DrawTree1(DTree: TDomTreeNode; prfx: string); 71 | procedure DrawTree(DTree: TDomTreeNode); 72 | procedure AddChildNode(ParentNode: TTreeNode; DTree: TDomTreeNode); 73 | { Private declarations } 74 | public 75 | { Public declarations } 76 | end; 77 | 78 | var 79 | Form1: TForm1; 80 | DomTree: TDomTree; 81 | 82 | implementation 83 | 84 | {$R *.dfm} 85 | 86 | procedure TForm1.DrawTree(DTree: TDomTreeNode); 87 | var 88 | NewNode: TTreeNode; 89 | NodeCap: string; 90 | i: integer; 91 | begin 92 | if DTree.Tag <> '' then 93 | NodeCap := DTree.GetTagName 94 | else 95 | NodeCap := DTree.Text; 96 | 97 | NewNode := TreeView1.Items.Add(nil, NodeCap); 98 | NewNode.Data := DTree; 99 | for i := 0 to DTree.Child.Count - 1 do 100 | begin 101 | AddChildNode(NewNode, DTree.Child.Items[i]); 102 | end; 103 | end; 104 | 105 | procedure TForm1.DrawTree1(DTree: TDomTreeNode; prfx: string); 106 | var 107 | i: integer; 108 | prfxline: string; 109 | begin 110 | memo1.Lines.Add(prfx + ' ' + DTree.Tag); 111 | prfxline := prfx + '-'; 112 | for i := 0 to DTree.Child.Count - 1 do 113 | begin 114 | drawTree1(DTree.Child.Items[i], prfxline); 115 | end; 116 | end; 117 | 118 | procedure TForm1.TabSheet1Show(Sender: TObject); 119 | begin 120 | TreeView1.Parent := Panel4; 121 | Memo1.Parent := Panel2; 122 | Memo1.Lines.Add('Enter your URL and click button "Parse"') 123 | end; 124 | 125 | procedure TForm1.TreeView1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 126 | var 127 | clickedNode: TTreeNode; 128 | begin 129 | 130 | if Button = mbRight then 131 | begin 132 | clickedNode := TreeView1.GetNodeAt(X, Y); 133 | if clickedNode <> nil then 134 | begin 135 | edit2.Text := TDomTreeNode(clickedNode.Data).GetPath(true); 136 | end; 137 | end; 138 | end; 139 | 140 | procedure TForm1.TreeView2DragDrop(Sender, Source: TObject; X, Y: Integer); 141 | var 142 | Node: TTreeNode; 143 | CaptNode: string; 144 | begin 145 | Node := TreeView2.GetNodeAt(X, Y); 146 | CaptNode := TDomTreeNode(TreeView1.Selected.Data).GetPath(true); 147 | if (Node <> nil) and (CaptNode <> '') then 148 | TreeView2.Items.AddChild(Node, CaptNode) 149 | else 150 | TreeView2.Items.Add(nil, CaptNode); 151 | end; 152 | 153 | procedure TForm1.TreeView2DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); 154 | begin 155 | Accept := (Source = TreeView1); //and (TreeView2.GetNodeAt(x, y) <> nil); 156 | end; 157 | 158 | procedure TForm1.TreeView2EndDrag(Sender, Target: TObject; X, Y: Integer); 159 | begin 160 | TreeView2.FullExpand; 161 | end; 162 | 163 | procedure TForm1.XPathShow(Sender: TObject); 164 | begin 165 | TreeView1.Parent := Panel6; 166 | Memo1.Parent := Panel10; 167 | TreeView2.FullExpand; 168 | Memo1.Lines.Add('Enter your XPath to Edit and click button "Find in DOM" for search node in DOM model'); 169 | Memo1.Lines.Add('or'); 170 | ; 171 | Memo1.Lines.Add('Drag and drop from DOM Tree to XPath Tree window and click button "Find all result"'); 172 | end; 173 | 174 | procedure TForm1.AddChildNode(ParentNode: TTreeNode; DTree: TDomTreeNode); 175 | var 176 | NewNode: TTreeNode; 177 | NodeCap: string; 178 | i: integer; 179 | begin 180 | if DTree.Tag <> '' then 181 | NodeCap := DTree.GetTagName 182 | else 183 | NodeCap := DTree.Text; 184 | NewNode := TreeView1.Items.AddChild(ParentNode, NodeCap); 185 | NewNode.Data := DTree; 186 | for i := 0 to DTree.Child.Count - 1 do 187 | begin 188 | AddChildNode(NewNode, DTree.Child.Items[i]); 189 | end; 190 | end; 191 | 192 | procedure TForm1.ParseBtClick(Sender: TObject); 193 | var 194 | // cnt,i,j,x,y,ind: integer; 195 | HtmlTxt: string; 196 | HtmlTxtList: TStringList; 197 | begin 198 | try 199 | if not (DomTree = nil) then 200 | FreeAndNil(DomTree); 201 | 202 | Memo1.Clear; 203 | TreeView1.Items.Clear; 204 | Memo1.Lines.Add('Start time GET- ' + DateTimeToStr(Now)); 205 | {HtmlTxtList:=TStringList.Create; 206 | HtmlTxtList.LoadFromFile('lotto.html'); 207 | HtmlTxt:=HtmlTxtList.Text;} 208 | HtmlTxt := HTTPClient1.Get(Edit1.Text).ContentAsString; 209 | 210 | Memo1.Lines.Add('End time GET- ' + DateTimeToStr(Now)); 211 | 212 | // create root node tree's structure 213 | DomTree := TDomTree.Create(); 214 | 215 | 216 | // parse HTML in tree's structure 217 | if not DomTree.RootNode.Parse(HtmlTxt) then 218 | showmessage('Don'#39'tParse HTML!'); 219 | 220 | Memo1.Lines.Add('End match time - ' + DateTimeToStr(Now)); 221 | if DomTree.ParseErr.Count = 0 then 222 | StatusBar1.Panels[0].Text := 'Parse result: OK' 223 | else 224 | StatusBar1.Panels[0].Text := 'Parse result: ' + IntToStr(DomTree.ParseErr.Count) + ' Error'; 225 | 226 | Memo1.Lines.Add('Parsing error and warning: ' + IntToStr(DomTree.ParseErr.Count)); 227 | Memo1.Lines.AddStrings(DomTree.ParseErr); 228 | // Show status Parse result 229 | if DomTree.ParseErr.Count = 0 then 230 | StatusBar1.Panels[0].Text := 'Parse result: OK' 231 | else 232 | StatusBar1.Panels[0].Text := 'Parse result: Error'; 233 | // Show total count of parsing nodes 234 | StatusBar1.Panels[1].Text := 'Count node: ' + inttostr(DomTree.Count); 235 | 236 | drawTree(DomTree.RootNode); 237 | TreeView1.Items.Item[1].Selected := true; 238 | 239 | Freeandnil(HtmlTxtList); 240 | except 241 | on E: Exception do 242 | ShowMessage(E.ClassName + ' : ' + E.Message); 243 | end; 244 | end; 245 | 246 | procedure TForm1.FindOneBtClick(Sender: TObject); 247 | var 248 | a: TDomTreeNodeList; 249 | b: tstringlist; 250 | i, j: integer; 251 | begin 252 | if TreeView1.Items.Count = 0 then 253 | exit; 254 | 255 | a := TDomTreeNodeList.Create; 256 | b := TStringList.Create; 257 | begin 258 | if DomTree.RootNode.FindPath(edit2.Text, a, b) then 259 | begin 260 | for j := 0 to a.Count - 1 do 261 | for i := 0 to TreeView1.Items.Count - 1 do 262 | if TreeView1.Items[i].Data = a[j] then 263 | begin 264 | TreeView1.Items.Item[i].TreeView.Select(TreeView1.Items.Item[i], [ssCtrl]); 265 | TreeView1.SetFocus; 266 | end; 267 | for i := 0 to b.Count - 1 do 268 | showmessage(b[i]); 269 | end 270 | else 271 | showmessage('Not found!'); 272 | end; 273 | a.Free; 274 | b.Free; 275 | end; 276 | 277 | procedure TForm1.Button1Click(Sender: TObject); 278 | begin 279 | TreeView2.FullCollapse; 280 | TreeView3.FullCollapse; 281 | end; 282 | 283 | procedure TForm1.Button2Click(Sender: TObject); 284 | begin 285 | TreeView2.FullExpand; 286 | TreeView3.FullExpand; 287 | end; 288 | 289 | procedure TForm1.Button3Click(Sender: TObject); 290 | var 291 | HtmlTxt, href: string; 292 | ListNode: TDomTreeNodeList; 293 | i: integer; 294 | DomChildTree: TDomTree; 295 | begin 296 | try 297 | if not (DomTree = nil) then 298 | FreeAndNil(DomTree); 299 | 300 | Memo2.Clear; 301 | Memo2.Lines.Add('Start time GET- ' + DateTimeToStr(Now)); 302 | HtmlTxt := IdHTTP1.Get(Edit3.Text); 303 | Memo2.Lines.Add('End time GET- ' + DateTimeToStr(Now)); 304 | DomTree := TDomTree.Create(); 305 | 306 | // parse HTML in tree's structure 307 | if not DomTree.RootNode.Parse(HtmlTxt) then 308 | showmessage('Don'#39'tParse HTML!'); 309 | Memo2.Lines.Add('End match time - ' + DateTimeToStr(Now)); 310 | if DomTree.ParseErr.Count = 0 then 311 | StatusBar1.Panels[0].Text := 'Parse result: OK' 312 | else 313 | StatusBar1.Panels[0].Text := 'Parse result: ' + IntToStr(DomTree.ParseErr.Count) + ' Error'; 314 | 315 | Memo2.Lines.Add('Parsing error: - ' + IntToStr(DomTree.ParseErr.Count)); 316 | Memo2.Lines.AddStrings(DomTree.ParseErr); 317 | // Show status Parse result 318 | if DomTree.ParseErr.Count = 0 then 319 | StatusBar1.Panels[0].Text := 'Parse result: OK' 320 | else 321 | StatusBar1.Panels[0].Text := 'Parse result: Error'; 322 | // Show total count of parsing nodes 323 | StatusBar1.Panels[1].Text := 'Count node: ' + inttostr(DomTree.Count); 324 | 325 | ListNode := TDomTreeNodeList.Create; 326 | if DomTree.RootNode.FindNode('a', 0, 'href="http', true, ListNode) then 327 | begin 328 | // if DomTree.RootNode.FindNode('a',0,'',true,ListNode) then 329 | for i := 0 to ListNode.Count - 1 do 330 | if ListNode[i].Attributes.TryGetValue('href', href) then 331 | begin 332 | Memo2.Lines.Add(href); 333 | end; 334 | 335 | Memo2.Lines.Add(' '); 336 | Memo2.Lines.Add(' '); 337 | 338 | for i := 0 to ListNode.Count - 1 do 339 | begin 340 | if ListNode[i].Attributes.TryGetValue('href', href) then 341 | begin 342 | FreeAndNil(DomChildTree); 343 | Memo2.Lines.Add(href); 344 | DomChildTree := TDomTree.Create(); 345 | try 346 | HtmlTxt := IdHTTP2.Get(AnsiDequotedStr(href, '"')); 347 | DomChildTree.RootNode.Parse(HtmlTxt); 348 | Memo2.Lines.Add('Parsing error and warning: ' + IntToStr(DomChildTree.ParseErr.Count)); 349 | Memo2.Lines.AddStrings(DomChildTree.ParseErr); 350 | Memo2.Lines.Add(''); 351 | except 352 | on E: Exception do // Memo2.Lines.Add(E.ClassName + ' : ' + E.Message); 353 | Memo2.Lines.Add(E.Message); 354 | end; 355 | end; 356 | end; 357 | FreeAndNil(DomChildTree); 358 | end; 359 | except 360 | on E: Exception do 361 | ShowMessage(E.ClassName + ' : ' + E.Message); 362 | end; 363 | end; 364 | 365 | procedure TForm1.ClearBtClick(Sender: TObject); 366 | begin 367 | TreeView2.Items.Clear; 368 | TreeView3.Items.Clear; 369 | end; 370 | 371 | procedure TForm1.FindAllBtClick(Sender: TObject); 372 | 373 | function AddResultToTree(hXPathNode: TTreeNode; hLevel: integer; hParentView: TTreeNode; hDomTreeNode: TDomTreeNode): TTreeNode; 374 | var 375 | FListNode: TDomTreeNodeList; 376 | FListText: tstringlist; 377 | i, j: integer; 378 | ToMemo: string; 379 | begin 380 | result := nil; 381 | 382 | FListNode := TDomTreeNodeList.Create; 383 | FListText := TStringList.Create; 384 | if hDomTreeNode.FindPath(hXPathNode.Text, FListNode, FListText) then 385 | begin 386 | memo1.Lines.Add('Found nodes: ' + IntToStr(FListNode.Count)); 387 | for i := 0 to FListNode.Count - 1 do 388 | ToMemo := ToMemo + format('[%s],', [FListNode[i].GetTagName]); 389 | memo1.Lines.Add('[' + LeftStr(ToMemo, Length(ToMemo) - 1) + ']'); 390 | ToMemo := ''; 391 | memo1.Lines.Add('Found text: ' + IntToStr(FListText.Count)); 392 | for i := 0 to FListText.Count - 1 do 393 | ToMemo := ToMemo + format('%s,', [FListText[i]]); 394 | memo1.Lines.Add(LeftStr(ToMemo, Length(ToMemo) - 1)); 395 | 396 | if FListText.Count > 0 then 397 | result := TreeView3.Items.AddChild(hParentView, LeftStr(ToMemo, Length(ToMemo) - 1)); 398 | 399 | for i := 0 to FListNode.Count - 1 do 400 | begin 401 | if FListText.Count = 0 then 402 | begin 403 | result := TreeView3.Items.AddChild(hParentView, FListNode[i].GetTagName); 404 | if hXPathNode.Count > 0 then 405 | for j := 0 to hXPathNode.Count - 1 do 406 | AddResultToTree(hXPathNode[j], hLevel + 1, result, FListNode[i]); 407 | end; 408 | end; 409 | end 410 | else 411 | memo1.Lines.Add(hXPathNode.Text + ' not found!'); 412 | FListNode.Free; 413 | FListText.Free; 414 | end; 415 | 416 | begin 417 | if (TreeView1.Items.Count = 0) or (TreeView2.Items.Count = 0) then 418 | exit; 419 | 420 | TreeView3.Items.Clear; 421 | begin 422 | AddResultToTree(TreeView2.Items[0], 1, nil, DomTree.RootNode) 423 | end; 424 | TreeView3.FullExpand; 425 | end; 426 | 427 | end. 428 | -------------------------------------------------------------------------------- /demo/ssl/libeay32.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HemulGM/HTML-Parser/1f0b751e6c4fba4d882e8e19269dff0e586f3230/demo/ssl/libeay32.dll -------------------------------------------------------------------------------- /demo/ssl/ssleay32.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HemulGM/HTML-Parser/1f0b751e6c4fba4d882e8e19269dff0e586f3230/demo/ssl/ssleay32.dll -------------------------------------------------------------------------------- /test/DemoParserTests.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HemulGM/HTML-Parser/1f0b751e6c4fba4d882e8e19269dff0e586f3230/test/DemoParserTests.res -------------------------------------------------------------------------------- /test/ParserTests.dpr: -------------------------------------------------------------------------------- 1 | program DemoParserTests; 2 | { 3 | 4 | Delphi DUnit Test Project 5 | ------------------------- 6 | This project contains the DUnit test framework and the GUI/Console test runners. 7 | Add "CONSOLE_TESTRUNNER" to the conditional defines entry in the project options 8 | to use the console test runner. Otherwise the GUI test runner will be used by 9 | default. 10 | 11 | } 12 | 13 | {$IFDEF CONSOLE_TESTRUNNER} 14 | {$APPTYPE CONSOLE} 15 | {$ENDIF} 16 | 17 | uses 18 | DUnitTestRunner, 19 | Testparser in 'Testparser.pas', 20 | HTML.Parser in '..\HTML.Parser.pas'; 21 | 22 | {$R *.RES} 23 | 24 | begin 25 | DUnitTestRunner.RunRegisteredTests; 26 | end. 27 | 28 | -------------------------------------------------------------------------------- /test/ParserTests.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {3BDF6518-3527-460A-98A3-324EB5967CF2} 4 | 18.8 5 | None 6 | True 7 | Debug 8 | Win32 9 | 1 10 | Console 11 | ParserTests.dpr 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Base 34 | true 35 | 36 | 37 | true 38 | Base 39 | true 40 | 41 | 42 | true 43 | Base 44 | true 45 | 46 | 47 | true 48 | Base 49 | true 50 | 51 | 52 | true 53 | Cfg_1 54 | true 55 | true 56 | 57 | 58 | true 59 | Base 60 | true 61 | 62 | 63 | ParserTests 64 | $(BDS)\Source\DUnit\src;$(DCC_UnitSearchPath) 65 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) 66 | _CONSOLE_TESTRUNNER;$(DCC_Define) 67 | . 68 | .\$(Platform)\$(Config) 69 | false 70 | false 71 | false 72 | false 73 | false 74 | $(BDS)\bin\delphi_PROJECTICON.ico 75 | $(BDS)\bin\delphi_PROJECTICNS.icns 76 | 77 | 78 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= 79 | Debug 80 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 81 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 82 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 83 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 84 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 85 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 86 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 87 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 88 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 89 | true 90 | true 91 | true 92 | true 93 | true 94 | true 95 | true 96 | true 97 | true 98 | true 99 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 100 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 101 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 102 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 103 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 104 | android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar 105 | 106 | 107 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png 108 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png 109 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png 110 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png 111 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png 112 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png 113 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png 114 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png 115 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png 116 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png 117 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png 118 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png 119 | 120 | 121 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png 122 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png 123 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png 124 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png 125 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png 126 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png 127 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png 128 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png 129 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png 130 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png 131 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png 132 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png 133 | 134 | 135 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png 136 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png 137 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png 138 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png 139 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png 140 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png 141 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png 142 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png 143 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png 144 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png 145 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png 146 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png 147 | 148 | 149 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 150 | IndyIPClient;FireDACASADriver;FireDACSqliteDriver;bindcompfmx;DBXSqliteDriver;vcldbx;FireDACPgDriver;FireDACODBCDriver;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;FireDACCommon;bindcomp;inetdb;TeeDB;inetdbbde;vclib;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DBXOdbcDriver;DataSnapServer;Tee;vclFireDAC;DataSnapProviderClient;xmlrtl;DBXSybaseASEDriver;ibxpress;DbxCommonDriver;svnui;vclimg;IndyProtocols;DBXMySQLDriver;dbxcds;DatasnapConnectorsFreePascal;FireDACCommonDriver;MetropolisUILiveTile;bindengine;vclactnband;vcldb;bindcompdbx;FMXTee;vcldsnap;bindcompvcl;soaprtl;TeeUI;vclie;fmxFireDAC;FireDACADSDriver;DBXDb2Driver;vcltouch;DBXOracleDriver;CustomIPTransport;vclribbon;VCLRESTComponents;dsnap;DBXInformixDriver;FireDAC;FireDACMSSQLDriver;fmxase;vcl;DataSnapConnectors;FireDACDataSnapDriver;IndyCore;DBXMSSQLDriver;CloudService;Intraweb;DBXFirebirdDriver;FireDACIBDriver;FmxTeeUI;inet;IndyIPCommon;fmxobj;FireDACDBXDriver;IndyIPServer;dsnapcon;FireDACMySQLDriver;VclSmp;vclx;inetdbxpress;svn;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;FireDACDb2Driver;RESTComponents;bdertl;FireDACMSAccDriver;dbexpress;adortl;DataSnapIndy10ServerTransport;$(DCC_UsePackage) 151 | CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) 152 | 1033 153 | 154 | 155 | IndyIPClient;FireDACASADriver;FireDACSqliteDriver;bindcompfmx;DBXSqliteDriver;FireDACPgDriver;FireDACODBCDriver;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;FireDACCommon;bindcomp;inetdb;TeeDB;vclib;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DBXOdbcDriver;DataSnapServer;Tee;vclFireDAC;DataSnapProviderClient;xmlrtl;DBXSybaseASEDriver;ibxpress;DbxCommonDriver;vclimg;IndyProtocols;DBXMySQLDriver;dbxcds;DatasnapConnectorsFreePascal;FireDACCommonDriver;MetropolisUILiveTile;bindengine;vclactnband;vcldb;bindcompdbx;FMXTee;vcldsnap;bindcompvcl;soaprtl;TeeUI;vclie;fmxFireDAC;FireDACADSDriver;DBXDb2Driver;vcltouch;DBXOracleDriver;CustomIPTransport;vclribbon;VCLRESTComponents;dsnap;DBXInformixDriver;FireDAC;FireDACMSSQLDriver;fmxase;vcl;DataSnapConnectors;FireDACDataSnapDriver;IndyCore;DBXMSSQLDriver;CloudService;Intraweb;DBXFirebirdDriver;FireDACIBDriver;FmxTeeUI;inet;IndyIPCommon;fmxobj;FireDACDBXDriver;IndyIPServer;dsnapcon;FireDACMySQLDriver;VclSmp;vclx;inetdbxpress;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;FireDACDb2Driver;RESTComponents;FireDACMSAccDriver;dbexpress;adortl;DataSnapIndy10ServerTransport;$(DCC_UsePackage) 156 | 157 | 158 | DEBUG;$(DCC_Define) 159 | true 160 | false 161 | true 162 | true 163 | true 164 | 165 | 166 | false 167 | 168 | 169 | false 170 | RELEASE;$(DCC_Define) 171 | 0 172 | 0 173 | 174 | 175 | 176 | MainSource 177 | 178 | 179 | 180 | 181 | Cfg_2 182 | Base 183 | 184 | 185 | Base 186 | 187 | 188 | Cfg_1 189 | Base 190 | 191 | 192 | 193 | Delphi.Personality.12 194 | 195 | 196 | 197 | 198 | False 199 | False 200 | 1 201 | 0 202 | 0 203 | 0 204 | False 205 | False 206 | False 207 | False 208 | False 209 | 1049 210 | 1251 211 | 212 | 213 | 214 | 215 | 1.0.0.0 216 | 217 | 218 | 219 | 220 | 221 | 1.0.0.0 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | ParserTests.dpr 249 | 250 | 251 | 252 | 253 | 254 | true 255 | 256 | 257 | 258 | 259 | true 260 | 261 | 262 | 263 | 264 | true 265 | 266 | 267 | 268 | 269 | ParserTests.exe 270 | true 271 | 272 | 273 | 274 | 275 | 1 276 | 277 | 278 | 0 279 | 280 | 281 | 282 | 283 | classes 284 | 1 285 | 286 | 287 | classes 288 | 1 289 | 290 | 291 | 292 | 293 | res\xml 294 | 1 295 | 296 | 297 | res\xml 298 | 1 299 | 300 | 301 | 302 | 303 | library\lib\armeabi-v7a 304 | 1 305 | 306 | 307 | 308 | 309 | library\lib\armeabi 310 | 1 311 | 312 | 313 | library\lib\armeabi 314 | 1 315 | 316 | 317 | 318 | 319 | library\lib\armeabi-v7a 320 | 1 321 | 322 | 323 | 324 | 325 | library\lib\mips 326 | 1 327 | 328 | 329 | library\lib\mips 330 | 1 331 | 332 | 333 | 334 | 335 | library\lib\armeabi-v7a 336 | 1 337 | 338 | 339 | library\lib\arm64-v8a 340 | 1 341 | 342 | 343 | 344 | 345 | library\lib\armeabi-v7a 346 | 1 347 | 348 | 349 | 350 | 351 | res\drawable 352 | 1 353 | 354 | 355 | res\drawable 356 | 1 357 | 358 | 359 | 360 | 361 | res\values 362 | 1 363 | 364 | 365 | res\values 366 | 1 367 | 368 | 369 | 370 | 371 | res\values-v21 372 | 1 373 | 374 | 375 | res\values-v21 376 | 1 377 | 378 | 379 | 380 | 381 | res\values 382 | 1 383 | 384 | 385 | res\values 386 | 1 387 | 388 | 389 | 390 | 391 | res\drawable 392 | 1 393 | 394 | 395 | res\drawable 396 | 1 397 | 398 | 399 | 400 | 401 | res\drawable-xxhdpi 402 | 1 403 | 404 | 405 | res\drawable-xxhdpi 406 | 1 407 | 408 | 409 | 410 | 411 | res\drawable-ldpi 412 | 1 413 | 414 | 415 | res\drawable-ldpi 416 | 1 417 | 418 | 419 | 420 | 421 | res\drawable-mdpi 422 | 1 423 | 424 | 425 | res\drawable-mdpi 426 | 1 427 | 428 | 429 | 430 | 431 | res\drawable-hdpi 432 | 1 433 | 434 | 435 | res\drawable-hdpi 436 | 1 437 | 438 | 439 | 440 | 441 | res\drawable-xhdpi 442 | 1 443 | 444 | 445 | res\drawable-xhdpi 446 | 1 447 | 448 | 449 | 450 | 451 | res\drawable-mdpi 452 | 1 453 | 454 | 455 | res\drawable-mdpi 456 | 1 457 | 458 | 459 | 460 | 461 | res\drawable-hdpi 462 | 1 463 | 464 | 465 | res\drawable-hdpi 466 | 1 467 | 468 | 469 | 470 | 471 | res\drawable-xhdpi 472 | 1 473 | 474 | 475 | res\drawable-xhdpi 476 | 1 477 | 478 | 479 | 480 | 481 | res\drawable-xxhdpi 482 | 1 483 | 484 | 485 | res\drawable-xxhdpi 486 | 1 487 | 488 | 489 | 490 | 491 | res\drawable-xxxhdpi 492 | 1 493 | 494 | 495 | res\drawable-xxxhdpi 496 | 1 497 | 498 | 499 | 500 | 501 | res\drawable-small 502 | 1 503 | 504 | 505 | res\drawable-small 506 | 1 507 | 508 | 509 | 510 | 511 | res\drawable-normal 512 | 1 513 | 514 | 515 | res\drawable-normal 516 | 1 517 | 518 | 519 | 520 | 521 | res\drawable-large 522 | 1 523 | 524 | 525 | res\drawable-large 526 | 1 527 | 528 | 529 | 530 | 531 | res\drawable-xlarge 532 | 1 533 | 534 | 535 | res\drawable-xlarge 536 | 1 537 | 538 | 539 | 540 | 541 | res\values 542 | 1 543 | 544 | 545 | res\values 546 | 1 547 | 548 | 549 | 550 | 551 | 1 552 | 553 | 554 | 1 555 | 556 | 557 | 0 558 | 559 | 560 | 561 | 562 | 1 563 | .framework 564 | 565 | 566 | 1 567 | .framework 568 | 569 | 570 | 0 571 | 572 | 573 | 574 | 575 | 1 576 | .dylib 577 | 578 | 579 | 1 580 | .dylib 581 | 582 | 583 | 0 584 | .dll;.bpl 585 | 586 | 587 | 588 | 589 | 1 590 | .dylib 591 | 592 | 593 | 1 594 | .dylib 595 | 596 | 597 | 1 598 | .dylib 599 | 600 | 601 | 1 602 | .dylib 603 | 604 | 605 | 1 606 | .dylib 607 | 608 | 609 | 0 610 | .bpl 611 | 612 | 613 | 614 | 615 | 0 616 | 617 | 618 | 0 619 | 620 | 621 | 0 622 | 623 | 624 | 0 625 | 626 | 627 | 0 628 | 629 | 630 | 0 631 | 632 | 633 | 0 634 | 635 | 636 | 0 637 | 638 | 639 | 640 | 641 | 1 642 | 643 | 644 | 1 645 | 646 | 647 | 1 648 | 649 | 650 | 651 | 652 | 1 653 | 654 | 655 | 1 656 | 657 | 658 | 1 659 | 660 | 661 | 662 | 663 | 1 664 | 665 | 666 | 1 667 | 668 | 669 | 1 670 | 671 | 672 | 673 | 674 | 1 675 | 676 | 677 | 1 678 | 679 | 680 | 1 681 | 682 | 683 | 684 | 685 | 1 686 | 687 | 688 | 1 689 | 690 | 691 | 1 692 | 693 | 694 | 695 | 696 | 1 697 | 698 | 699 | 1 700 | 701 | 702 | 1 703 | 704 | 705 | 706 | 707 | 1 708 | 709 | 710 | 1 711 | 712 | 713 | 1 714 | 715 | 716 | 717 | 718 | 1 719 | 720 | 721 | 1 722 | 723 | 724 | 1 725 | 726 | 727 | 728 | 729 | 1 730 | 731 | 732 | 1 733 | 734 | 735 | 1 736 | 737 | 738 | 739 | 740 | 1 741 | 742 | 743 | 1 744 | 745 | 746 | 1 747 | 748 | 749 | 750 | 751 | 1 752 | 753 | 754 | 1 755 | 756 | 757 | 1 758 | 759 | 760 | 761 | 762 | 1 763 | 764 | 765 | 1 766 | 767 | 768 | 1 769 | 770 | 771 | 772 | 773 | 1 774 | 775 | 776 | 1 777 | 778 | 779 | 1 780 | 781 | 782 | 783 | 784 | 1 785 | 786 | 787 | 1 788 | 789 | 790 | 1 791 | 792 | 793 | 794 | 795 | 1 796 | 797 | 798 | 1 799 | 800 | 801 | 1 802 | 803 | 804 | 805 | 806 | 1 807 | 808 | 809 | 1 810 | 811 | 812 | 1 813 | 814 | 815 | 816 | 817 | 1 818 | 819 | 820 | 1 821 | 822 | 823 | 1 824 | 825 | 826 | 827 | 828 | 1 829 | 830 | 831 | 1 832 | 833 | 834 | 1 835 | 836 | 837 | 838 | 839 | 1 840 | 841 | 842 | 1 843 | 844 | 845 | 1 846 | 847 | 848 | 849 | 850 | 1 851 | 852 | 853 | 1 854 | 855 | 856 | 1 857 | 858 | 859 | 860 | 861 | 1 862 | 863 | 864 | 1 865 | 866 | 867 | 1 868 | 869 | 870 | 871 | 872 | 1 873 | 874 | 875 | 1 876 | 877 | 878 | 1 879 | 880 | 881 | 882 | 883 | 1 884 | 885 | 886 | 1 887 | 888 | 889 | 1 890 | 891 | 892 | 893 | 894 | 1 895 | 896 | 897 | 1 898 | 899 | 900 | 1 901 | 902 | 903 | 904 | 905 | 1 906 | 907 | 908 | 1 909 | 910 | 911 | 912 | 913 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 914 | 1 915 | 916 | 917 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 918 | 1 919 | 920 | 921 | 922 | 923 | 924 | 925 | 926 | 1 927 | 928 | 929 | 1 930 | 931 | 932 | 1 933 | 934 | 935 | 936 | 937 | 938 | 939 | 940 | Contents\Resources 941 | 1 942 | 943 | 944 | Contents\Resources 945 | 1 946 | 947 | 948 | 949 | 950 | library\lib\armeabi-v7a 951 | 1 952 | 953 | 954 | library\lib\arm64-v8a 955 | 1 956 | 957 | 958 | 1 959 | 960 | 961 | 1 962 | 963 | 964 | 1 965 | 966 | 967 | 1 968 | 969 | 970 | 1 971 | 972 | 973 | 1 974 | 975 | 976 | 0 977 | 978 | 979 | 980 | 981 | library\lib\armeabi-v7a 982 | 1 983 | 984 | 985 | 986 | 987 | 1 988 | 989 | 990 | 1 991 | 992 | 993 | 994 | 995 | Assets 996 | 1 997 | 998 | 999 | Assets 1000 | 1 1001 | 1002 | 1003 | 1004 | 1005 | Assets 1006 | 1 1007 | 1008 | 1009 | Assets 1010 | 1 1011 | 1012 | 1013 | 1014 | 1015 | 1016 | 1017 | 1018 | 1019 | 1020 | 1021 | 1022 | 1023 | 1024 | 1025 | False 1026 | False 1027 | False 1028 | False 1029 | False 1030 | False 1031 | True 1032 | False 1033 | 1034 | 1035 | DUnit / Delphi Win32 1036 | GUI 1037 | 1038 | 1039 | 1040 | 1041 | 12 1042 | 1043 | 1044 | 1045 | 1046 | 1047 | -------------------------------------------------------------------------------- /test/ParserTests.dproj.local: -------------------------------------------------------------------------------- 1 |  2 | 3 | -------------------------------------------------------------------------------- /test/ParserTests.identcache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HemulGM/HTML-Parser/1f0b751e6c4fba4d882e8e19269dff0e586f3230/test/ParserTests.identcache -------------------------------------------------------------------------------- /test/ParserTests.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HemulGM/HTML-Parser/1f0b751e6c4fba4d882e8e19269dff0e586f3230/test/ParserTests.res -------------------------------------------------------------------------------- /test/Testparser.pas: -------------------------------------------------------------------------------- 1 | unit Testparser; 2 | { 3 | 4 | Delphi DUnit Test Case 5 | ---------------------- 6 | This unit contains a skeleton test case class generated by the Test Case Wizard. 7 | Modify the generated code to correctly setup and call the methods from the unit 8 | being tested. 9 | 10 | } 11 | 12 | interface 13 | 14 | uses 15 | TestFramework, System.SysUtils, System.Generics.Collections, HTML.Parser, System.Contnrs, 16 | System.RegularExpressionsCore, System.StrUtils, System.Classes; 17 | 18 | type 19 | 20 | // Test methods for class TDomTree 21 | TestTDomTree = class(TTestCase) 22 | strict private 23 | FDomTree: TDomTree; 24 | public 25 | procedure SetUp; override; 26 | procedure TearDown; override; 27 | end; 28 | 29 | // Test methods for class TDomTreeNode 30 | TestTDomTreeNode = class(TTestCase) 31 | strict private 32 | FDomTreeNode: TDomTreeNode; 33 | public 34 | procedure SetUp; override; 35 | procedure TearDown; override; 36 | published 37 | procedure TestParse; 38 | procedure TestGetTagName; 39 | procedure TestGetAttrValue; 40 | procedure TestGetTextValue; 41 | procedure TestGetComment; 42 | procedure TestFindNode; 43 | procedure TestFindTagOfIndex; 44 | procedure TestGetPath; 45 | procedure TestFindPath; 46 | end; 47 | 48 | // Test methods for class TChildList 49 | TestTChildList = class(TTestCase) 50 | strict private 51 | FChildList: TDomTreeNodeList; 52 | public 53 | procedure SetUp; override; 54 | procedure TearDown; override; 55 | end; 56 | 57 | // Test methods for class TPrmRecList 58 | TestTPrmRecList = class(TTestCase) 59 | strict private 60 | FPrmRecList: TPrmRecList; 61 | public 62 | procedure SetUp; override; 63 | procedure TearDown; override; 64 | end; 65 | 66 | implementation 67 | 68 | procedure TestTDomTree.SetUp; 69 | begin 70 | FDomTree := TDomTree.Create; 71 | end; 72 | 73 | procedure TestTDomTree.TearDown; 74 | begin 75 | FDomTree.Free; 76 | FDomTree := nil; 77 | end; 78 | 79 | procedure TestTDomTreeNode.SetUp; 80 | var 81 | DomTree: TDomTree; 82 | begin 83 | DomTree := TDomTree.Create; 84 | FDomTreeNode := DomTree.RootNode; 85 | CheckEquals('Root', FDomTreeNode.Tag); 86 | CheckEquals('', FDomTreeNode.TypeTag); 87 | CheckEquals('', FDomTreeNode.AttributesTxt); 88 | CheckEquals('', FDomTreeNode.Text); 89 | 90 | CheckEquals(0, FDomTreeNode.Child.Count); 91 | end; 92 | 93 | procedure TestTDomTreeNode.TearDown; 94 | begin 95 | FDomTreeNode.Free; 96 | FDomTreeNode := nil; 97 | end; 98 | 99 | procedure TestTDomTreeNode.TestParse; 100 | var 101 | ReturnValue: Boolean; 102 | HtmlTxt: TStringList; 103 | tmp: string; 104 | tmpNode: TDomTreeNode; 105 | begin 106 | HtmlTxt := TStringList.Create; 107 | HtmlTxt.LoadFromFile('test.html'); 108 | 109 | ReturnValue := FDomTreeNode.Parse(HtmlTxt.Text); 110 | CheckEquals(true, ReturnValue); 111 | //check ', FDomTreeNode.Child[0].Tag); 113 | CheckEquals('%s', FDomTreeNode.Child[0].Typetag); 114 | CheckEquals('', FDomTreeNode.Child[0].AttributesTxt); 115 | CheckEquals('', FDomTreeNode.Child[0].Text); 116 | //check multiline comment 117 | tmp := 118 | ''; 119 | CheckEquals(tmp, FDomTreeNode.Child[2].Tag); 120 | //check Exceptions contain any symbols 121 | tmp := 'Title " '#39'document'; 122 | tmpNode := FDomTreeNode.Child[3].child[0].child[0].child[0]; 123 | CheckEquals(tmp, tmpNode.Text); 124 | tmpNode := FDomTreeNode.Child[3].child[1].child[1]; 125 | CheckEquals('textarea', AnsiLowerCase(tmpNode.Tag)); 126 | CheckEquals('This disabled field? don'#39't write here<123/>', tmpNode.child[0].Text); 127 | 128 | //check attributes 129 | tmpNode := FDomTreeNode.Child[3].child[1]; 130 | CheckEquals('body', AnsiLowerCase(tmpNode.Tag)); 131 | CheckEquals(true, tmpNode.Attributes.ContainsKey('class')); 132 | CheckEquals(true, tmpNode.Attributes.TryGetValue('class', tmp)); 133 | CheckEquals('"default"', tmp); 134 | CheckEquals(true, tmpNode.Attributes.ContainsKey('bgcolor')); 135 | CheckEquals(true, tmpNode.Attributes.TryGetValue('bgcolor', tmp)); 136 | CheckEquals(#39'blue'#39, tmp); 137 | tmpNode := FDomTreeNode.Child[3].child[1].child[1]; 138 | CheckEquals('textarea', AnsiLowerCase(tmpNode.Tag)); 139 | CheckEquals(true, tmpNode.Attributes.ContainsKey('disabled')); 140 | CheckEquals(false, tmpNode.Attributes.TryGetValue('class', tmp)); 141 | end; 142 | 143 | procedure TestTDomTreeNode.TestGetTagName; 144 | var 145 | ReturnValue: string; 146 | tmpNode: TDomTreeNode; 147 | HtmlTxt: TStringList; 148 | begin 149 | HtmlTxt := TStringList.Create; 150 | HtmlTxt.LoadFromFile('test.html'); 151 | FDomTreeNode.Parse(HtmlTxt.Text); 152 | tmpNode := FDomTreeNode.Child[3].child[1].child[1]; 153 | ReturnValue := tmpNode.GetTagName; 154 | CheckEquals(' 12 | 13 |
14 | 15 | 16 | 17 | 256 | 257 |
18 | 19 | 20 | 21 | 251 | 252 |
22 |
23 |
24 |

25 |
26 | 27 |
28 | 246 |
247 |
248 |
249 |
250 |
253 | 254 | 255 |
258 |
259 |
260 |

Пример программы

261 | 262 | while (<>) { 263 | $org=$_; 264 | s/\\["']//g; 265 | s/\/\/[^:].*//; 266 | s/\/\*.*\*\///g; 267 | if ($comment == 1) { 268 | if (s/.*\*\///) { 269 | $comment = 0; 270 | } 271 | else { 272 | next; 273 | } 274 | } 275 | if (s/\/\*.*//) { 276 | $comment = 1; 277 | } 278 | if (/^\s*#/) { 279 | next; 280 | } 281 | } 282 | 283 | -------------------------------------------------------------------------------- /test/test.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HemulGM/HTML-Parser/1f0b751e6c4fba4d882e8e19269dff0e586f3230/test/test.html --------------------------------------------------------------------------------