xmlxsd.pas 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960
  1. unit xmlxsd;
  2. {$mode objfpc}
  3. {$H+}
  4. interface
  5. uses
  6. libxml2,
  7. DateUtils,
  8. SysUtils;
  9. { Format functions }
  10. function xsdFormatBoolean(Value: Boolean): String;
  11. function xsdFormatDate(Year, Month, Day: Longword): String;
  12. function xsdFormatDate(Date: TDateTime): String;
  13. function xsdFormatTime(Hour, Minute, Second: Longword): String;
  14. function xsdFormatTime(Time: TDateTime): String;
  15. function xsdFormatDateTime(Year, Month, Day, Hour, Minute, Second: Longword): String;
  16. function xsdFormatDateTime(DateTime: TDateTime): String;
  17. function xsdFormatDecimal(Value: Extended; Precision: Integer = 4; Digits: Integer = 1): String;
  18. function xsdFormatDouble(Value: Double): String;
  19. function xsdFormatFloat(Value: Single): String;
  20. function xsdFormatByte(Value: Shortint): String;
  21. function xsdFormatShort(Value: Smallint): String;
  22. function xsdFormatInt(Value: Longint): String;
  23. function xsdFormatLong(Value: Int64): String;
  24. function xsdFormatUnsignedByte(Value: Byte): String;
  25. function xsdFormatUnsignedShort(Value: Word): String;
  26. function xsdFormatUnsignedInt(Value: Longword): String;
  27. function xsdFormatUnsignedLong(Value: QWord): String;
  28. { Node creation functions }
  29. function xsdNewChildString(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: String): xmlNodePtr;
  30. function xsdNewChildBoolean(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Boolean): xmlNodePtr;
  31. function xsdNewChildDate(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day: Longword): xmlNodePtr;
  32. function xsdNewChildTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Hour, Minute, Second: Longword): xmlNodePtr;
  33. function xsdNewChildDateTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day, Hour, Minute, Second: Longword): xmlNodePtr;
  34. function xsdNewChildDecimal(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Extended; Precision: Integer = 4; Digits: Integer = 1): xmlNodePtr;
  35. function xsdNewChildDouble(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Double): xmlNodePtr;
  36. function xsdNewChildFloat(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Single): xmlNodePtr;
  37. function xsdNewChildByte(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Shortint): xmlNodePtr;
  38. function xsdNewChildShort(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Smallint): xmlNodePtr;
  39. function xsdNewChildInt(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longint): xmlNodePtr;
  40. function xsdNewChildLong(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Int64): xmlNodePtr;
  41. function xsdNewChildUnsignedByte(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Byte): xmlNodePtr;
  42. function xsdNewChildUnsignedShort(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Word): xmlNodePtr;
  43. function xsdNewChildUnsignedInt(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longword): xmlNodePtr;
  44. function xsdNewChildUnsignedLong(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: QWord): xmlNodePtr;
  45. { Property creation functions }
  46. function xsdNewPropString(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: String): xmlAttrPtr;
  47. function xsdNewPropBoolean(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Boolean): xmlAttrPtr;
  48. function xsdNewPropDate(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day: Longword): xmlAttrPtr;
  49. function xsdNewPropTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Hour, Minute, Second: Longword): xmlAttrPtr;
  50. function xsdNewPropDateTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day, Hour, Minute, Second: Longword): xmlAttrPtr;
  51. function xsdNewPropDecimal(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Extended; Precision: Integer = 4; Digits: Integer = 1): xmlAttrPtr;
  52. function xsdNewPropDouble(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Double): xmlAttrPtr;
  53. function xsdNewPropFloat(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Single): xmlAttrPtr;
  54. function xsdNewPropByte(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Shortint): xmlAttrPtr;
  55. function xsdNewPropShort(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Smallint): xmlAttrPtr;
  56. function xsdNewPropInt(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longint): xmlAttrPtr;
  57. function xsdNewPropLong(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Int64): xmlAttrPtr;
  58. function xsdNewPropUnsignedByte(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Byte): xmlAttrPtr;
  59. function xsdNewPropUnsignedShort(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Word): xmlAttrPtr;
  60. function xsdNewPropUnsignedInt(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longword): xmlAttrPtr;
  61. function xsdNewPropUnsignedLong(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: QWord): xmlAttrPtr;
  62. { Query functions }
  63. const
  64. NS_IGNORE : xmlCharPtr = nil;
  65. NS_EXCLUDE : xmlCharPtr = pointer(-1);
  66. { Node query functions }
  67. function xsdHasChild(node: xmlNodePtr; name: xmlCharPtr; index: Integer = 0): xmlNodePtr;
  68. function xsdHasNsChild(node: xmlNodePtr; name, nameSpace: xmlCharPtr; index: Integer = 0): xmlNodePtr;
  69. function xsdGetChild(node: xmlNodePtr; name: xmlCharPtr; index: Integer = 0): xmlCharPtr;
  70. function xsdGetNsChild(node: xmlNodePtr; name, nameSpace: xmlCharPtr; index: Integer = 0): xmlCharPtr;
  71. function xsdGetChildString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: String; index: Integer = 0): String;
  72. function xsdGetChildBoolean(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Boolean; index: Integer = 0): Boolean;
  73. function xsdGetChildDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime; index: Integer = 0): TDateTime;
  74. function xsdGetChildTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime; index: Integer = 0): TDateTime;
  75. function xsdGetChildDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime; index: Integer = 0): TDateTime;
  76. function xsdGetChildDecimal(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Extended; index: Integer = 0): Extended;
  77. function xsdGetChildDouble(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Double; index: Integer = 0): Double;
  78. function xsdGetChildFloat(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Single; index: Integer = 0): Single;
  79. function xsdGetChildByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Shortint; index: Integer = 0): Shortint;
  80. function xsdGetChildShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Smallint; index: Integer = 0): Smallint;
  81. function xsdGetChildInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Longint; index: Integer = 0): Longint;
  82. function xsdGetChildLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Int64; index: Integer = 0): Int64;
  83. function xsdGetChildUnsignedByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Byte; index: Integer = 0): Byte;
  84. function xsdGetChildUnsignedShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Word; index: Integer = 0): Word;
  85. function xsdGetChildUnsignedInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Longword; index: Integer = 0): Longword;
  86. function xsdGetChildUnsignedLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: QWord; index: Integer = 0): QWord;
  87. function xsdGetChildEnumString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; Values: array of string; index: Integer = 0): Integer;
  88. { Property query functions }
  89. function xsdHasProp(node: xmlNodePtr; name: xmlCharPtr): xmlAttrPtr;
  90. function xsdHasNsProp(node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlAttrPtr;
  91. function xsdGetProp(node: xmlNodePtr; name: xmlCharPtr): xmlCharPtr;
  92. function xsdGetNsProp(node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlCharPtr;
  93. function xsdGetPropString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: String): String;
  94. function xsdGetPropBoolean(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Boolean): Boolean;
  95. function xsdGetPropDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime): TDateTime;
  96. function xsdGetPropTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime): TDateTime;
  97. function xsdGetPropDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime): TDateTime;
  98. function xsdGetPropDecimal(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Extended): Extended;
  99. function xsdGetPropDouble(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Double): Double;
  100. function xsdGetPropFloat(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Single): Single;
  101. function xsdGetPropByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Shortint): Shortint;
  102. function xsdGetPropShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Smallint): Smallint;
  103. function xsdGetPropInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Longint): Longint;
  104. function xsdGetPropLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Int64): Int64;
  105. function xsdGetPropUnsignedByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Byte): Byte;
  106. function xsdGetPropUnsignedShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Word): Word;
  107. function xsdGetPropUnsignedInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Longword): Longword;
  108. function xsdGetPropUnsignedLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: QWord): QWord;
  109. function xsdGetPropEnumString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; Values: array of string): Integer;
  110. function xsdRemoveBlanks(content: xmlCharPtr; out cleaned: string): boolean;
  111. implementation
  112. function xsdFormatBoolean(Value: Boolean): String;
  113. begin
  114. if Value then
  115. Result := 'true'
  116. else
  117. Result := 'false';
  118. end;
  119. function xsdFormatDate(Year, Month, Day: Longword): String;
  120. begin
  121. Result := Format('%4.4d-%2.2d-%2.2dZ', [Year, Month, Day]);
  122. end;
  123. function xsdFormatDate(Date: TDateTime): String;
  124. var
  125. Year, Month, Day: Word;
  126. begin
  127. DecodeDate(Date, Year, Month, Day);
  128. Result := xsdFormatDate(Year, Month, Day);
  129. end;
  130. function xsdFormatTime(Hour, Minute, Second: Longword): String;
  131. begin
  132. Result := Format('%2.2d:%2.2d:%2.2dZ', [Hour, Minute, Second]);
  133. end;
  134. function xsdFormatTime(Time: TDateTime): String;
  135. var
  136. Hour, Minute, Second, Millisecond: Word;
  137. begin
  138. DecodeTime(Time, Hour, Minute, Second, Millisecond);
  139. Result := xsdFormatTime(Hour, Minute, Second);
  140. end;
  141. function xsdFormatDateTime(Year, Month, Day, Hour, Minute, Second: Longword): String;
  142. begin
  143. Result := Format('%4.4d-%2.2d-%2.2dT%2.2d:%2.2d:%2.2dZ', [Year, Month, Day, Hour, Minute, Second]);
  144. end;
  145. function xsdFormatDateTime(DateTime: TDateTime): String;
  146. var
  147. Year, Month, Day, Hour, Minute, Second, Millisecond: Word;
  148. begin
  149. DecodeDateTime(DateTime, Year, Month, Day, Hour, Minute, Second, Millisecond);
  150. Result := xsdFormatDateTime(Year, Month, Day, Hour, Minute, Second);
  151. end;
  152. function xsdFormatDecimal(Value: Extended; Precision: Integer; Digits: Integer): String;
  153. begin
  154. Result := FloatToStrF(Value, ffFixed, Precision, Digits);
  155. end;
  156. function xsdFormatDouble(Value: Double): String;
  157. begin
  158. Result := FloatToStr(Value);
  159. end;
  160. function xsdFormatFloat(Value: Single): String;
  161. begin
  162. Result := FloatToStr(Value);
  163. end;
  164. function xsdFormatByte(Value: Shortint): String;
  165. begin
  166. Result := IntToStr(Value);
  167. end;
  168. function xsdFormatShort(Value: Smallint): String;
  169. begin
  170. Result := IntToStr(Value);
  171. end;
  172. function xsdFormatInt(Value: Integer): String;
  173. begin
  174. Result := IntToStr(Value);
  175. end;
  176. function xsdFormatLong(Value: Int64): String;
  177. begin
  178. Result := IntToStr(Value);
  179. end;
  180. function xsdFormatUnsignedByte(Value: Byte): String;
  181. begin
  182. Result := IntToStr(Value);
  183. end;
  184. function xsdFormatUnsignedShort(Value: Word): String;
  185. begin
  186. Result := IntToStr(Value);
  187. end;
  188. function xsdFormatUnsignedInt(Value: Longword): String;
  189. begin
  190. Result := IntToStr(Value);
  191. end;
  192. function xsdFormatUnsignedLong(Value: QWord): String;
  193. begin
  194. Result := IntToStr(Value);
  195. end;
  196. function xsdNewChildString(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: String): xmlNodePtr;
  197. begin
  198. Result := xmlNewChild(parent, ns, name, BAD_CAST(Value));
  199. end;
  200. function xsdNewChildBoolean(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Boolean): xmlNodePtr;
  201. var
  202. Tmp: String;
  203. begin
  204. Tmp := xsdFormatBoolean(Value);
  205. Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp));
  206. end;
  207. function xsdNewChildTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Hour, Minute, Second: Longword): xmlNodePtr;
  208. var
  209. Tmp: String;
  210. begin
  211. Tmp := xsdFormatTime(Hour, Minute, Second);
  212. Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp));
  213. end;
  214. function xsdNewChildDate(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day: Longword): xmlNodePtr;
  215. var
  216. Tmp: String;
  217. begin
  218. Tmp := xsdFormatDate(Year, Month, Day);
  219. Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp));
  220. end;
  221. function xsdNewChildDateTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day, Hour, Minute, Second: Longword): xmlNodePtr;
  222. var
  223. Tmp: String;
  224. begin
  225. Tmp := xsdFormatDateTime(Year, Month, Day, Hour, Minute, Second);
  226. Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp));
  227. end;
  228. function xsdNewChildDecimal(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Extended; Precision: Integer; Digits: Integer): xmlNodePtr;
  229. var
  230. Tmp: String;
  231. begin
  232. Tmp := xsdFormatDecimal(Value, Precision, Digits);
  233. Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp));
  234. end;
  235. function xsdNewChildDouble(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Double): xmlNodePtr;
  236. var
  237. Tmp: String;
  238. begin
  239. Tmp := xsdFormatDouble(Value);
  240. Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp));
  241. end;
  242. function xsdNewChildFloat(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Single): xmlNodePtr;
  243. var
  244. Tmp: String;
  245. begin
  246. Tmp := xsdFormatFloat(Value);
  247. Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp));
  248. end;
  249. function xsdNewChildByte(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Shortint): xmlNodePtr;
  250. var
  251. Tmp: String;
  252. begin
  253. Tmp := xsdFormatByte(Value);
  254. Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp));
  255. end;
  256. function xsdNewChildShort(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Smallint): xmlNodePtr;
  257. var
  258. Tmp: String;
  259. begin
  260. Tmp := xsdFormatShort(Value);
  261. Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp));
  262. end;
  263. function xsdNewChildInt(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longint): xmlNodePtr;
  264. var
  265. Tmp: String;
  266. begin
  267. Tmp := xsdFormatInt(Value);
  268. Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp));
  269. end;
  270. function xsdNewChildLong(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Int64): xmlNodePtr;
  271. var
  272. Tmp: String;
  273. begin
  274. Tmp := xsdFormatLong(Value);
  275. Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp));
  276. end;
  277. function xsdNewChildUnsignedByte(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Byte): xmlNodePtr;
  278. var
  279. Tmp: String;
  280. begin
  281. Tmp := xsdFormatUnsignedByte(Value);
  282. Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp));
  283. end;
  284. function xsdNewChildUnsignedShort(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Word): xmlNodePtr;
  285. var
  286. Tmp: String;
  287. begin
  288. Tmp := xsdFormatUnsignedShort(Value);
  289. Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp));
  290. end;
  291. function xsdNewChildUnsignedInt(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longword): xmlNodePtr;
  292. var
  293. Tmp: String;
  294. begin
  295. Tmp := xsdFormatUnsignedInt(Value);
  296. Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp));
  297. end;
  298. function xsdNewChildUnsignedLong(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: QWord): xmlNodePtr;
  299. var
  300. Tmp: String;
  301. begin
  302. Tmp := xsdFormatUnsignedLong(Value);
  303. Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp));
  304. end;
  305. function xsdNewPropString(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: String): xmlAttrPtr;
  306. begin
  307. Result := xmlNewNsProp(node, ns, name, BAD_CAST(Value));
  308. end;
  309. function xsdNewPropBoolean(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Boolean): xmlAttrPtr;
  310. var
  311. Tmp: String;
  312. begin
  313. Tmp := xsdFormatBoolean(Value);
  314. Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp));
  315. end;
  316. function xsdNewPropTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Hour, Minute, Second: Longword): xmlAttrPtr;
  317. var
  318. Tmp: String;
  319. begin
  320. Tmp := xsdFormatTime(Hour, Minute, Second);
  321. Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp));
  322. end;
  323. function xsdNewPropDate(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day: Longword): xmlAttrPtr;
  324. var
  325. Tmp: String;
  326. begin
  327. Tmp := xsdFormatDate(Year, Month, Day);
  328. Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp));
  329. end;
  330. function xsdNewPropDateTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day, Hour, Minute, Second: Longword): xmlAttrPtr;
  331. var
  332. Tmp: String;
  333. begin
  334. Tmp := xsdFormatDateTime(Year, Month, Day, Hour, Minute, Second);
  335. Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp));
  336. end;
  337. function xsdNewPropDecimal(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Extended; Precision: Integer; Digits: Integer): xmlAttrPtr;
  338. var
  339. Tmp: String;
  340. begin
  341. Tmp := xsdFormatDecimal(Value, Precision, Digits);
  342. Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp));
  343. end;
  344. function xsdNewPropDouble(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Double): xmlAttrPtr;
  345. var
  346. Tmp: String;
  347. begin
  348. Tmp := xsdFormatDouble(Value);
  349. Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp));
  350. end;
  351. function xsdNewPropFloat(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Single): xmlAttrPtr;
  352. var
  353. Tmp: String;
  354. begin
  355. Tmp := xsdFormatFloat(Value);
  356. Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp));
  357. end;
  358. function xsdNewPropByte(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Shortint): xmlAttrPtr;
  359. var
  360. Tmp: String;
  361. begin
  362. Tmp := xsdFormatByte(Value);
  363. Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp));
  364. end;
  365. function xsdNewPropShort(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Smallint): xmlAttrPtr;
  366. var
  367. Tmp: String;
  368. begin
  369. Tmp := xsdFormatShort(Value);
  370. Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp));
  371. end;
  372. function xsdNewPropInt(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longint): xmlAttrPtr;
  373. var
  374. Tmp: String;
  375. begin
  376. Tmp := xsdFormatInt(Value);
  377. Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp));
  378. end;
  379. function xsdNewPropLong(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Int64): xmlAttrPtr;
  380. var
  381. Tmp: String;
  382. begin
  383. Tmp := xsdFormatLong(Value);
  384. Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp));
  385. end;
  386. function xsdNewPropUnsignedByte(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Byte): xmlAttrPtr;
  387. var
  388. Tmp: String;
  389. begin
  390. Tmp := xsdFormatUnsignedByte(Value);
  391. Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp));
  392. end;
  393. function xsdNewPropUnsignedShort(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Word): xmlAttrPtr;
  394. var
  395. Tmp: String;
  396. begin
  397. Tmp := xsdFormatUnsignedShort(Value);
  398. Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp));
  399. end;
  400. function xsdNewPropUnsignedInt(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longword): xmlAttrPtr;
  401. var
  402. Tmp: String;
  403. begin
  404. Tmp := xsdFormatUnsignedInt(Value);
  405. Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp));
  406. end;
  407. function xsdNewPropUnsignedLong(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: QWord): xmlAttrPtr;
  408. var
  409. Tmp: String;
  410. begin
  411. Tmp := xsdFormatUnsignedLong(Value);
  412. Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp));
  413. end;
  414. function xsdHasChild(node: xmlNodePtr; name: xmlCharPtr; index: integer): xmlNodePtr;
  415. begin
  416. Result := xsdHasNsChild(node, name, nil, index);
  417. end;
  418. function xsdHasNsChild(node: xmlNodePtr; name, nameSpace: xmlCharPtr; index: integer): xmlNodePtr;
  419. begin
  420. if Assigned(node) and (Index >= 0) then
  421. begin
  422. node := node^.children;
  423. while Assigned(node) do
  424. begin
  425. if (xmlStrEqual(name, node^.name) <> 0) and ((nameSpace = NS_IGNORE) or
  426. ((nameSpace = NS_EXCLUDE) and (node^.ns = nil)) or
  427. ((nameSpace <> NS_EXCLUDE) and (nameSpace <> NS_IGNORE) and (node^.ns <> nil) and (xmlStrEqual(nameSpace, node^.ns^.prefix) <> 0))) then
  428. begin
  429. if index = 0 then
  430. begin
  431. result := node;
  432. Exit;
  433. end;
  434. Dec(Index);
  435. end;
  436. node := node^.next;
  437. end;
  438. end;
  439. Result := nil;
  440. end;
  441. function xsdGetChild(node: xmlNodePtr; name: xmlCharPtr; index: Integer): xmlCharPtr;
  442. begin
  443. Result := xsdGetNsChild(node, name, nil, index);
  444. end;
  445. function xsdGetNsChild(node: xmlNodePtr; name, nameSpace: xmlCharPtr; index: Integer): xmlCharPtr;
  446. var
  447. child: xmlNodePtr;
  448. begin
  449. child := xsdHasNsChild(node, name, nameSpace, index);
  450. if Assigned(child) then
  451. result := xmlNodeGetContent(child)
  452. else
  453. result := nil;
  454. end;
  455. function xsdGetChildString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: String; index: Integer): String;
  456. var
  457. value: xmlCharPtr;
  458. begin
  459. value := xsdGetNsChild(node, name, nameSpace, index);
  460. if assigned(value) then
  461. result := pchar(value)
  462. else
  463. result := defaultValue;
  464. end;
  465. function xsdGetChildBoolean(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Boolean; index: Integer): Boolean;
  466. var
  467. value: xmlCharPtr;
  468. begin
  469. value := xsdGetNsChild(node, name, nameSpace, index);
  470. if assigned(value) then
  471. result := StrToBoolDef(pchar(value), defaultValue)
  472. else
  473. result := defaultValue;
  474. end;
  475. function xsdGetChildDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime; index: Integer): TDateTime;
  476. var
  477. value: xmlCharPtr;
  478. begin
  479. value := xsdGetNsChild(node, name, nameSpace, index);
  480. {if assigned(value) then
  481. result := StrToBoolDef(pchar(value), defaultValue)
  482. else}
  483. result := defaultValue;
  484. end;
  485. function xsdGetChildTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime; index: Integer): TDateTime;
  486. var
  487. value: xmlCharPtr;
  488. begin
  489. value := xsdGetNsChild(node, name, nameSpace, index);
  490. {if assigned(value) then
  491. result := StrToBoolDef(pchar(value), defaultValue)
  492. else}
  493. result := defaultValue;
  494. end;
  495. function xsdGetChildDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime; index: Integer): TDateTime;
  496. var
  497. value: xmlCharPtr;
  498. begin
  499. value := xsdGetNsChild(node, name, nameSpace, index);
  500. {if assigned(value) then
  501. result := StrToBoolDef(pchar(value), defaultValue)
  502. else}
  503. result := defaultValue;
  504. end;
  505. function xsdGetChildDecimal(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Extended; index: Integer): Extended;
  506. var
  507. value: xmlCharPtr;
  508. begin
  509. value := xsdGetNsChild(node, name, nameSpace, index);
  510. if assigned(value) then
  511. result := StrToFloatDef(pchar(value), defaultValue)
  512. else
  513. result := defaultValue;
  514. end;
  515. function xsdGetChildDouble(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Double; index: Integer): Double;
  516. var
  517. value: xmlCharPtr;
  518. begin
  519. value := xsdGetNsChild(node, name, nameSpace, index);
  520. if assigned(value) then
  521. result := StrToFloatDef(pchar(value), defaultValue)
  522. else
  523. result := defaultValue;
  524. end;
  525. function xsdGetChildFloat(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Single; index: Integer): Single;
  526. var
  527. value: xmlCharPtr;
  528. begin
  529. value := xsdGetNsChild(node, name, nameSpace, index);
  530. if assigned(value) then
  531. result := StrToFloatDef(pchar(value), defaultValue)
  532. else
  533. result := defaultValue;
  534. end;
  535. function xsdGetChildByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Shortint; index: Integer): Shortint;
  536. var
  537. value: xmlCharPtr;
  538. begin
  539. value := xsdGetNsChild(node, name, nameSpace, index);
  540. if assigned(value) then
  541. result := StrToIntDef(pchar(value), defaultValue)
  542. else
  543. result := defaultValue;
  544. end;
  545. function xsdGetChildShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Smallint; index: Integer): Smallint;
  546. var
  547. value: xmlCharPtr;
  548. begin
  549. value := xsdGetNsChild(node, name, nameSpace, index);
  550. if assigned(value) then
  551. result := StrToIntDef(pchar(value), defaultValue)
  552. else
  553. result := defaultValue;
  554. end;
  555. function xsdGetChildInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Longint; index: Integer): Longint;
  556. var
  557. value: xmlCharPtr;
  558. begin
  559. value := xsdGetNsChild(node, name, nameSpace, index);
  560. if assigned(value) then
  561. result := StrToIntDef(pchar(value), defaultValue)
  562. else
  563. result := defaultValue;
  564. end;
  565. function xsdGetChildLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Int64; index: Integer): Int64;
  566. var
  567. value: xmlCharPtr;
  568. begin
  569. value := xsdGetNsChild(node, name, nameSpace, index);
  570. if assigned(value) then
  571. result := StrToIntDef(pchar(value), defaultValue)
  572. else
  573. result := defaultValue;
  574. end;
  575. function xsdGetChildUnsignedByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Byte; index: Integer): Byte;
  576. var
  577. value: xmlCharPtr;
  578. begin
  579. value := xsdGetNsChild(node, name, nameSpace, index);
  580. if assigned(value) then
  581. result := StrToIntDef(pchar(value), defaultValue)
  582. else
  583. result := defaultValue;
  584. end;
  585. function xsdGetChildUnsignedShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Word; index: Integer): Word;
  586. var
  587. value: xmlCharPtr;
  588. begin
  589. value := xsdGetNsChild(node, name, nameSpace, index);
  590. if assigned(value) then
  591. result := StrToIntDef(pchar(value), defaultValue)
  592. else
  593. result := defaultValue;
  594. end;
  595. function xsdGetChildUnsignedInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Longword; index: Integer): Longword;
  596. var
  597. value: xmlCharPtr;
  598. begin
  599. value := xsdGetNsChild(node, name, nameSpace, index);
  600. if assigned(value) then
  601. result := StrToIntDef(pchar(value), defaultValue)
  602. else
  603. result := defaultValue;
  604. end;
  605. function xsdGetChildUnsignedLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: QWord; index: Integer): QWord;
  606. var
  607. value: xmlCharPtr;
  608. begin
  609. value := xsdGetNsChild(node, name, nameSpace, index);
  610. if assigned(value) then
  611. result := StrToIntDef(pchar(value), defaultValue)
  612. else
  613. result := defaultValue;
  614. end;
  615. function IndexOfString(const S: String; const List: array of String): Integer;
  616. var
  617. I: Integer;
  618. begin
  619. for I := 0 to Length(List) - 1 do
  620. if List[I] = S then
  621. Exit(I);
  622. Result := -1;
  623. end;
  624. function xsdGetChildEnumString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; Values: array of string; index: Integer = 0): Integer;
  625. begin
  626. Result := IndexOfString(xsdGetChildString(node, name, nameSpace, Values[0], index), Values);
  627. end;
  628. function xsdHasProp(node: xmlNodePtr; name: xmlCharPtr): xmlAttrPtr;
  629. begin
  630. result := xsdHasNsProp(node, name, nil);
  631. end;
  632. function xsdHasNsProp(node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlAttrPtr;
  633. begin
  634. if nameSpace = NS_EXCLUDE then
  635. begin
  636. result := xmlHasProp(node, name);
  637. if Assigned(result) and (result^.ns <> nil) then
  638. result := nil;
  639. end else
  640. result := xmlHasNsProp(node, name, nameSpace);
  641. end;
  642. function xsdGetProp(node: xmlNodePtr; name: xmlCharPtr): xmlCharPtr;
  643. begin
  644. result := xmlGetProp(node, name);
  645. end;
  646. function xsdGetNsProp(node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlCharPtr;
  647. begin
  648. if nameSpace = NS_EXCLUDE then
  649. result := xmlGetNoNsProp(node, name)
  650. else
  651. result := xmlGetNsProp(node, name, nameSpace);
  652. end;
  653. function xsdGetPropString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: String): String;
  654. var
  655. value: xmlCharPtr;
  656. begin
  657. value := xsdGetNsProp(node, name, nameSpace);
  658. if assigned(value) then
  659. result := pchar(value)
  660. else
  661. result := defaultValue;
  662. end;
  663. function xsdGetPropBoolean(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Boolean): Boolean;
  664. var
  665. value: xmlCharPtr;
  666. begin
  667. value := xsdGetNsProp(node, name, nameSpace);
  668. if assigned(value) then
  669. result := StrToBoolDef(pchar(value), defaultValue)
  670. else
  671. result := defaultValue;
  672. end;
  673. function xsdGetPropDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime): TDateTime;
  674. var
  675. value: xmlCharPtr;
  676. begin
  677. {value := xsdGetNsProp(node, name, nameSpace);
  678. if assigned(value) then
  679. result := StrToIntDef(pchar(value), defaultValue)
  680. else}
  681. result := defaultValue;
  682. end;
  683. function xsdGetPropTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime): TDateTime;
  684. var
  685. value: xmlCharPtr;
  686. begin
  687. {value := xsdGetNsProp(node, name, nameSpace);
  688. if assigned(value) then
  689. result := StrToIntDef(pchar(value), defaultValue)
  690. else}
  691. result := defaultValue;
  692. end;
  693. function xsdGetPropDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime): TDateTime;
  694. var
  695. value: xmlCharPtr;
  696. begin
  697. {value := xsdGetNsProp(node, name, nameSpace);
  698. if assigned(value) then
  699. result := StrToIntDef(pchar(value), defaultValue)
  700. else}
  701. result := defaultValue;
  702. end;
  703. function xsdGetPropDecimal(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Extended): Extended;
  704. var
  705. value: xmlCharPtr;
  706. begin
  707. value := xsdGetNsProp(node, name, nameSpace);
  708. if assigned(value) then
  709. result := StrToFloatDef(pchar(value), defaultValue)
  710. else
  711. result := defaultValue;
  712. end;
  713. function xsdGetPropDouble(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Double): Double;
  714. var
  715. value: xmlCharPtr;
  716. begin
  717. value := xsdGetNsProp(node, name, nameSpace);
  718. if assigned(value) then
  719. result := StrToFloatDef(pchar(value), defaultValue)
  720. else
  721. result := defaultValue;
  722. end;
  723. function xsdGetPropFloat(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Single): Single;
  724. var
  725. value: xmlCharPtr;
  726. begin
  727. value := xsdGetNsProp(node, name, nameSpace);
  728. if assigned(value) then
  729. result := StrToFloatDef(pchar(value), defaultValue)
  730. else
  731. result := defaultValue;
  732. end;
  733. function xsdGetPropByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Shortint): Shortint;
  734. var
  735. value: xmlCharPtr;
  736. begin
  737. value := xsdGetNsProp(node, name, nameSpace);
  738. if assigned(value) then
  739. result := StrToIntDef(pchar(value), defaultValue)
  740. else
  741. result := defaultValue;
  742. end;
  743. function xsdGetPropShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Smallint): Smallint;
  744. var
  745. value: xmlCharPtr;
  746. begin
  747. value := xsdGetNsProp(node, name, nameSpace);
  748. if assigned(value) then
  749. result := StrToIntDef(pchar(value), defaultValue)
  750. else
  751. result := defaultValue;
  752. end;
  753. function xsdGetPropInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Longint): Longint;
  754. var
  755. value: xmlCharPtr;
  756. begin
  757. value := xsdGetNsProp(node, name, nameSpace);
  758. if assigned(value) then
  759. result := StrToIntDef(pchar(value), defaultValue)
  760. else
  761. result := defaultValue;
  762. end;
  763. function xsdGetPropLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Int64): Int64;
  764. var
  765. value: xmlCharPtr;
  766. begin
  767. value := xsdGetNsProp(node, name, nameSpace);
  768. if assigned(value) then
  769. result := StrToIntDef(pchar(value), defaultValue)
  770. else
  771. result := defaultValue;
  772. end;
  773. function xsdGetPropUnsignedByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Byte): Byte;
  774. var
  775. value: xmlCharPtr;
  776. begin
  777. value := xsdGetNsProp(node, name, nameSpace);
  778. if assigned(value) then
  779. result := StrToIntDef(pchar(value), defaultValue)
  780. else
  781. result := defaultValue;
  782. end;
  783. function xsdGetPropUnsignedShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Word): Word;
  784. var
  785. value: xmlCharPtr;
  786. begin
  787. value := xsdGetNsProp(node, name, nameSpace);
  788. if assigned(value) then
  789. result := StrToIntDef(pchar(value), defaultValue)
  790. else
  791. result := defaultValue;
  792. end;
  793. function xsdGetPropUnsignedInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Longword): Longword;
  794. var
  795. value: xmlCharPtr;
  796. begin
  797. value := xsdGetNsProp(node, name, nameSpace);
  798. if assigned(value) then
  799. result := StrToIntDef(pchar(value), defaultValue)
  800. else
  801. result := defaultValue;
  802. end;
  803. function xsdGetPropUnsignedLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: QWord): QWord;
  804. var
  805. value: xmlCharPtr;
  806. begin
  807. value := xsdGetNsProp(node, name, nameSpace);
  808. if assigned(value) then
  809. result := StrToIntDef(pchar(value), defaultValue)
  810. else
  811. result := defaultValue;
  812. end;
  813. function xsdGetPropEnumString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; Values: array of string): Integer;
  814. begin
  815. result := IndexOfString(xsdGetPropString(node, name, nameSpace, Values[0]), Values);
  816. end;
  817. function xsdRemoveBlanks(content: xmlCharPtr; out cleaned: string): boolean;
  818. var
  819. Space: Boolean;
  820. len: Integer;
  821. begin
  822. cleaned := '';
  823. if Assigned(content) then
  824. begin
  825. Space := True;
  826. while content^ <> 0 do
  827. begin
  828. if xmlIsBlank(content^) then
  829. begin
  830. if not Space then
  831. cleaned := cleaned + ' ';
  832. Space := True;
  833. end else begin
  834. cleaned := cleaned + chr(content^);
  835. Space := False;
  836. end;
  837. Inc(content);
  838. end;
  839. end;
  840. len := Length(cleaned);
  841. if len > 0 then
  842. begin
  843. if cleaned[len] = ' ' then
  844. SetLength(cleaned, len-1);
  845. Result := True;
  846. end else
  847. Result := False;
  848. end;
  849. end.