reader1.pas 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. (**
  2. * section: xmlReader
  3. * synopsis: Parse an XML file with an xmlReader
  4. * purpose: Demonstrate the use of xmlReaderForFile() to parse an XML file
  5. * and dump the informations about the nodes found in the process.
  6. * (Note that the XMLReader functions require libxml2 version later
  7. * than 2.6.)
  8. * usage: reader1 <filename>
  9. * test: reader1 test2.xml > reader1.tmp ; diff reader1.tmp reader1.res ; rm reader1.tmp
  10. * author: Daniel Veillard
  11. * copy: see Copyright for the status of this software.
  12. *)
  13. program reader1;
  14. {$mode objfpc}
  15. uses
  16. ctypes,
  17. xml2,
  18. exutils;
  19. (**
  20. * processNode:
  21. * @reader: the xmlReader
  22. *
  23. * Dump information about the current node
  24. *)
  25. procedure processNode(reader: xmlTextReaderPtr);
  26. var
  27. value, name: xmlCharPtr;
  28. begin
  29. name := xmlTextReaderConstName(reader);
  30. if not assigned(name) then
  31. name := '--';
  32. value := xmlTextReaderConstValue(reader);
  33. printf('%d %d %s %d %d',
  34. [xmlTextReaderDepth(reader),
  35. xmlTextReaderNodeType(reader),
  36. name,
  37. xmlTextReaderIsEmptyElement(reader),
  38. xmlTextReaderHasValue(reader)]);
  39. if not assigned(value) then
  40. writeln
  41. else
  42. if (xmlStrlen(value) > 40) then
  43. printfn(' %.40s...\n', [value])
  44. else
  45. printfn(' %s\n', [value]);
  46. end;
  47. (**
  48. * streamFile:
  49. * @filename: the file name to parse
  50. *
  51. * Parse and print information about an XML file.
  52. *)
  53. procedure streamFile(const filename: pchar);
  54. var
  55. reader: xmlTextReaderPtr;
  56. ret: cint;
  57. begin
  58. reader := xmlReaderForFile(filename, nil, 0);
  59. if assigned(reader) then
  60. begin
  61. ret := xmlTextReaderRead(reader);
  62. while ret = 1 do
  63. begin
  64. processNode(reader);
  65. ret := xmlTextReaderRead(reader);
  66. end;
  67. xmlFreeTextReader(reader);
  68. if ret <> 0 then
  69. printfn('%s : failed to parse', [filename]);
  70. end else
  71. printfn('Unable to open %s', [filename]);
  72. end;
  73. begin
  74. (*
  75. * this initialize the library and check potential ABI mismatches
  76. * between the version it was compiled for and the actual shared
  77. * library used.
  78. *)
  79. LIBXML_TEST_VERSION;
  80. streamFile(pchar(ParamStr(1)));
  81. (*
  82. * Cleanup function for the XML library.
  83. *)
  84. xmlCleanupParser();
  85. end.