xmlxsd.pas 65 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394
  1. {
  2. A set of helper functions for libxml2 for FreePascal
  3. Copyright (C) 2008 by Ivo Steinmann
  4. }
  5. {$IFNDEF FPC_DOTTEDUNITS}
  6. unit xmlxsd;
  7. {$ENDIF FPC_DOTTEDUNITS}
  8. {$mode objfpc}
  9. {$H+}
  10. interface
  11. {$IFDEF FPC_DOTTEDUNITS}
  12. uses
  13. System.CTypes,
  14. Api.XML.Xml2,
  15. Api.XML.Xsdparser,
  16. System.Math,
  17. System.Classes,
  18. System.DateUtils,
  19. System.SysUtils;
  20. {$ELSE FPC_DOTTEDUNITS}
  21. uses
  22. ctypes,
  23. xml2,
  24. xmlxsdparser,
  25. Math,
  26. Classes,
  27. DateUtils,
  28. SysUtils;
  29. {$ENDIF FPC_DOTTEDUNITS}
  30. resourcestring
  31. SChildNotFound = 'child %s not found';
  32. SPropNotFound = 'attribute %s not found';
  33. const
  34. IGNORE_LAST = Pointer(-1);
  35. type
  36. XSDException = class(Exception)
  37. public
  38. constructor CreateNode(const Msg: String; name, nameSpace: xmlCharPtr);
  39. end;
  40. { Node creation functions }
  41. function xsdNewChildBase64(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: TStream): xmlNodePtr;
  42. function xsdNewChildCData(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: AnsiString): xmlNodePtr;
  43. function xsdNewChildString(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: AnsiString): xmlNodePtr;
  44. function xsdNewChildBoolean(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Boolean; UseWords: Boolean = False): xmlNodePtr;
  45. function xsdNewChildDate(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day: Longword; BC: Boolean = False; Timezone: PXsdTimezone = nil): xmlNodePtr;
  46. function xsdNewChildDate(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Date: TDateTime; Timezone: PXsdTimezone = nil): xmlNodePtr;
  47. function xsdNewChildTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone = nil): xmlNodePtr;
  48. function xsdNewChildTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Time: TDateTime; Timezone: PXsdTimezone = nil): xmlNodePtr;
  49. function xsdNewChildDateTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day, Hour, Minute, Second, Milliseconds: Longword; BC: Boolean = False; Timezone: PXsdTimezone = nil): xmlNodePtr;
  50. function xsdNewChildDateTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; DateTime: TDateTime; Timezone: PXsdTimezone = nil): xmlNodePtr;
  51. function xsdNewChildDecimal(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Extended; Precision: Integer = 4; Digits: Integer = 1): xmlNodePtr;
  52. function xsdNewChildDouble(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Double): xmlNodePtr;
  53. function xsdNewChildFloat(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Single): xmlNodePtr;
  54. function xsdNewChildByte(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Shortint): xmlNodePtr;
  55. function xsdNewChildShort(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Smallint): xmlNodePtr;
  56. function xsdNewChildInt(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longint): xmlNodePtr;
  57. function xsdNewChildLong(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Int64): xmlNodePtr;
  58. function xsdNewChildUnsignedByte(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Byte): xmlNodePtr;
  59. function xsdNewChildUnsignedShort(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Word): xmlNodePtr;
  60. function xsdNewChildUnsignedInt(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longword): xmlNodePtr;
  61. function xsdNewChildUnsignedLong(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: QWord): xmlNodePtr;
  62. function xsdNewChildEnum(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; enum: array of AnsiString; Value: Integer): xmlNodePtr;
  63. { Property creation functions }
  64. function xsdNewPropString(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: AnsiString): xmlAttrPtr;
  65. function xsdNewPropBoolean(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Boolean; UseWords: Boolean = False): xmlAttrPtr;
  66. function xsdNewPropDate(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day: Longword; BC: Boolean = False; Timezone: PXsdTimezone = nil): xmlAttrPtr;
  67. function xsdNewPropDate(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Date: TDateTime; Timezone: PXsdTimezone = nil): xmlAttrPtr;
  68. function xsdNewPropTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone = nil): xmlAttrPtr;
  69. function xsdNewPropTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Time: TDateTime; Timezone: PXsdTimezone = nil): xmlAttrPtr;
  70. function xsdNewPropDateTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day, Hour, Minute, Second, Milliseconds: Longword; BC: Boolean = False; Timezone: PXsdTimezone = nil): xmlAttrPtr;
  71. function xsdNewPropDateTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; DateTime: TDateTime; Timezone: PXsdTimezone = nil): xmlAttrPtr;
  72. function xsdNewPropDecimal(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Extended; Precision: Integer = 4; Digits: Integer = 1): xmlAttrPtr;
  73. function xsdNewPropDouble(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Double): xmlAttrPtr;
  74. function xsdNewPropFloat(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Single): xmlAttrPtr;
  75. function xsdNewPropByte(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Shortint): xmlAttrPtr;
  76. function xsdNewPropShort(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Smallint): xmlAttrPtr;
  77. function xsdNewPropInt(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longint): xmlAttrPtr;
  78. function xsdNewPropLong(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Int64): xmlAttrPtr;
  79. function xsdNewPropUnsignedByte(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Byte): xmlAttrPtr;
  80. function xsdNewPropUnsignedShort(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Word): xmlAttrPtr;
  81. function xsdNewPropUnsignedInt(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longword): xmlAttrPtr;
  82. function xsdNewPropUnsignedLong(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: QWord): xmlAttrPtr;
  83. function xsdNewPropEnum(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; enum: array of AnsiString; Value: Integer): xmlAttrPtr;
  84. { Query functions }
  85. const
  86. NS_IGNORE : xmlCharPtr = nil;
  87. NS_EXCLUDE : xmlCharPtr = pointer(-1);
  88. { Node query functions }
  89. function xsdTestNodeNs(node: xmlNodePtr; nameSpace: xmlCharPtr): Boolean;
  90. function xsdTestNode(node: xmlNodePtr; name, nameSpace: xmlCharPtr): Boolean;
  91. function xsdTryGetChild(node: xmlNodePtr; name, nameSpace: xmlCharPtr; Index: Integer = 0): xmlNodePtr;
  92. function xsdTryGetChild(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out child: xmlNodePtr; Index: Integer = 0): Boolean;
  93. function xsdTryGetChildChars(node: xmlNodePtr; name, nameSpace: xmlCharPtr; Index: Integer = 0): xmlCharPtr;
  94. function xsdTryGetChildBase64(node: xmlNodePtr; name, nameSpace: xmlCharPtr; const Value: TStream; Index: Integer = 0): Boolean;
  95. function xsdTryGetChildString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: AnsiString; Index: Integer = 0): Boolean;
  96. function xsdTryGetChildBoolean(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Boolean; Index: Integer = 0): Boolean;
  97. function xsdTryGetChildDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day: Longword; Timezone: PXsdTimezone = nil; BC: PBoolean = nil; Index: Integer = 0): Boolean;
  98. function xsdTryGetChildDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil; Index: Integer = 0): Boolean;
  99. function xsdTryGetChildTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone = nil; Index: Integer = 0): Boolean;
  100. function xsdTryGetChildTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil; Index: Integer = 0): Boolean;
  101. function xsdTryGetChildDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day, Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone = nil; BC: PBoolean = nil; Index: Integer = 0): Boolean;
  102. function xsdTryGetChildDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil; Index: Integer = 0): Boolean;
  103. function xsdTryGetChildDecimal(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Extended; Index: Integer = 0): Boolean;
  104. function xsdTryGetChildDouble(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Double; Index: Integer = 0): Boolean;
  105. function xsdTryGetChildFloat(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Single; Index: Integer = 0): Boolean;
  106. function xsdTryGetChildByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Shortint; Index: Integer = 0): Boolean;
  107. function xsdTryGetChildShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Smallint; Index: Integer = 0): Boolean;
  108. function xsdTryGetChildInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longint; Index: Integer = 0): Boolean;
  109. function xsdTryGetChildLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Int64; Index: Integer = 0): Boolean;
  110. function xsdTryGetChildUnsignedByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Byte; Index: Integer = 0): Boolean;
  111. function xsdTryGetChildUnsignedShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Word; Index: Integer = 0): Boolean;
  112. function xsdTryGetChildUnsignedInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longword; Index: Integer = 0): Boolean;
  113. function xsdTryGetChildUnsignedLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: QWord; Index: Integer = 0): Boolean;
  114. function xsdTryGetChildEnum(node: xmlNodePtr; name, nameSpace: xmlCharPtr; enum: array of AnsiString; out Value: Integer; Index: Integer = 0): Boolean;
  115. function xsdGetChild(node: xmlNodePtr; name, nameSpace: xmlCharPtr; Index: Integer = 0): xmlNodePtr;
  116. function xsdGetChildChars(node: xmlNodePtr; name, nameSpace: xmlCharPtr; Index: Integer = 0): xmlCharPtr;
  117. procedure xsdGetChildBase64(node: xmlNodePtr; name, nameSpace: xmlCharPtr; const Value: TStream; Index: Integer = 0);
  118. procedure xsdGetChildString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: AnsiString; Index: Integer = 0);
  119. procedure xsdGetChildBoolean(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Boolean; Index: Integer = 0);
  120. procedure xsdGetChildDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day: Longword; Timezone: PXsdTimezone = nil; BC: PBoolean = nil; Index: Integer = 0);
  121. procedure xsdGetChildDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil; Index: Integer = 0);
  122. procedure xsdGetChildTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone = nil; Index: Integer = 0);
  123. procedure xsdGetChildTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil; Index: Integer = 0);
  124. procedure xsdGetChildDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day, Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone = nil; BC: PBoolean = nil; Index: Integer = 0);
  125. procedure xsdGetChildDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil; Index: Integer = 0);
  126. procedure xsdGetChildDecimal(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Extended; Index: Integer = 0);
  127. procedure xsdGetChildDouble(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Double; Index: Integer = 0);
  128. procedure xsdGetChildFloat(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Single; Index: Integer = 0);
  129. procedure xsdGetChildByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Shortint; Index: Integer = 0);
  130. procedure xsdGetChildShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Smallint; Index: Integer = 0);
  131. procedure xsdGetChildInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longint; Index: Integer = 0);
  132. procedure xsdGetChildLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Int64; Index: Integer = 0);
  133. procedure xsdGetChildUnsignedByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Byte; Index: Integer = 0);
  134. procedure xsdGetChildUnsignedShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Word; Index: Integer = 0);
  135. procedure xsdGetChildUnsignedInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longword; Index: Integer = 0);
  136. procedure xsdGetChildUnsignedLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: QWord; Index: Integer = 0);
  137. procedure xsdGetChildEnum(node: xmlNodePtr; name, nameSpace: xmlCharPtr; enum: array of AnsiString; out Value: Integer; Index: Integer = 0);
  138. { Node parsing functions }
  139. function xsdTryNext(var node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlNodePtr;
  140. function xsdTryNext(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out last: xmlNodePtr): Boolean;
  141. function xsdTryNextChars(var node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlCharPtr;
  142. function xsdTryNextBase64(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; const Value: TStream): Boolean;
  143. function xsdTryNextString(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: AnsiString): Boolean;
  144. function xsdTryNextBoolean(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Boolean): Boolean;
  145. function xsdTryNextDate(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day: Longword; Timezone: PXsdTimezone = nil; BC: PBoolean = nil): Boolean;
  146. function xsdTryNextDate(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil): Boolean;
  147. function xsdTryNextTime(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone = nil): Boolean;
  148. function xsdTryNextTime(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil): Boolean;
  149. function xsdTryNextDateTime(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day, Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone = nil; BC: PBoolean = nil): Boolean;
  150. function xsdTryNextDateTime(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil): Boolean;
  151. function xsdTryNextDecimal(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Extended): Boolean;
  152. function xsdTryNextDouble(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Double): Boolean;
  153. function xsdTryNextFloat(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Single): Boolean;
  154. function xsdTryNextByte(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Shortint): Boolean;
  155. function xsdTryNextShort(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Smallint): Boolean;
  156. function xsdTryNextInt(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longint): Boolean;
  157. function xsdTryNextLong(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Int64): Boolean;
  158. function xsdTryNextUnsignedByte(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Byte): Boolean;
  159. function xsdTryNextUnsignedShort(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Word): Boolean;
  160. function xsdTryNextUnsignedInt(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longword): Boolean;
  161. function xsdTryNextUnsignedLong(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: QWord): Boolean;
  162. function xsdTryNextEnum(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; enum: array of AnsiString; out Value: Integer): Boolean;
  163. function xsdNext(var node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlNodePtr;
  164. function xsdNextChars(var node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlCharPtr;
  165. procedure xsdNextBase64(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; const Value: TStream);
  166. procedure xsdNextString(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: AnsiString);
  167. procedure xsdNextBoolean(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Boolean);
  168. procedure xsdNextDate(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day: Longword; Timezone: PXsdTimezone = nil; BC: PBoolean = nil);
  169. procedure xsdNextDate(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil);
  170. procedure xsdNextTime(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone = nil);
  171. procedure xsdNextTime(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil);
  172. procedure xsdNextDateTime(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day, Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone = nil; BC: PBoolean = nil);
  173. procedure xsdNextDateTime(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil);
  174. procedure xsdNextDecimal(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Extended);
  175. procedure xsdNextDouble(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Double);
  176. procedure xsdNextFloat(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Single);
  177. procedure xsdNextByte(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Shortint);
  178. procedure xsdNextShort(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Smallint);
  179. procedure xsdNextInt(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longint);
  180. procedure xsdNextLong(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Int64);
  181. procedure xsdNextUnsignedByte(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Byte);
  182. procedure xsdNextUnsignedShort(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Word);
  183. procedure xsdNextUnsignedInt(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longword);
  184. procedure xsdNextUnsignedLong(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: QWord);
  185. procedure xsdNextEnum(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; enum: array of AnsiString; out Value: Integer);
  186. { Property query functions }
  187. function xsdTestPropNs(attr: xmlAttrPtr; nameSpace: xmlCharPtr): Boolean;
  188. function xsdTestProp(attr: xmlAttrPtr; name, nameSpace: xmlCharPtr): Boolean;
  189. function xsdTryGetProp(node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlAttrPtr;
  190. function xsdTryGetPropChars(node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlCharPtr;
  191. function xsdTryGetPropString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: AnsiString): Boolean;
  192. function xsdTryGetPropBoolean(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Boolean): Boolean;
  193. function xsdTryGetPropDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day: Longword; Timezone: PXsdTimezone = nil; BC: PBoolean = nil): Boolean;
  194. function xsdTryGetPropDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil): Boolean;
  195. function xsdTryGetPropTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone = nil): Boolean;
  196. function xsdTryGetPropTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil): Boolean;
  197. function xsdTryGetPropDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day, Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone = nil; BC: PBoolean = nil): Boolean;
  198. function xsdTryGetPropDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil): Boolean;
  199. function xsdTryGetPropDecimal(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Extended): Boolean;
  200. function xsdTryGetPropDouble(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Double): Boolean;
  201. function xsdTryGetPropFloat(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Single): Boolean;
  202. function xsdTryGetPropByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Shortint): Boolean;
  203. function xsdTryGetPropShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Smallint): Boolean;
  204. function xsdTryGetPropInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longint): Boolean;
  205. function xsdTryGetPropLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Int64): Boolean;
  206. function xsdTryGetPropUnsignedByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Byte): Boolean;
  207. function xsdTryGetPropUnsignedShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Word): Boolean;
  208. function xsdTryGetPropUnsignedInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longword): Boolean;
  209. function xsdTryGetPropUnsignedLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: QWord): Boolean;
  210. function xsdTryGetPropEnum(node: xmlNodePtr; name, nameSpace: xmlCharPtr; enum: array of AnsiString; out Value: Integer): Boolean;
  211. function xsdGetProp(node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlAttrPtr;
  212. function xsdGetPropChars(node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlCharPtr;
  213. procedure xsdGetPropString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: AnsiString);
  214. procedure xsdGetPropBoolean(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Boolean);
  215. procedure xsdGetPropDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day: Longword; Timezone: PXsdTimezone = nil; BC: PBoolean = nil);
  216. procedure xsdGetPropDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil);
  217. procedure xsdGetPropTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone = nil);
  218. procedure xsdGetPropTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil);
  219. procedure xsdGetPropDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day, Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone = nil; BC: PBoolean = nil);
  220. procedure xsdGetPropDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone = nil);
  221. procedure xsdGetPropDecimal(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Extended);
  222. procedure xsdGetPropDouble(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Double);
  223. procedure xsdGetPropFloat(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Single);
  224. procedure xsdGetPropByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Shortint);
  225. procedure xsdGetPropShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Smallint);
  226. procedure xsdGetPropInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longint);
  227. procedure xsdGetPropLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Int64);
  228. procedure xsdGetPropUnsignedByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Byte);
  229. procedure xsdGetPropUnsignedShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Word);
  230. procedure xsdGetPropUnsignedInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longword);
  231. procedure xsdGetPropUnsignedLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: QWord);
  232. procedure xsdGetPropEnum(node: xmlNodePtr; name, nameSpace: xmlCharPtr; enum: array of AnsiString; out Value: Integer);
  233. function xsdRemoveBlanks(content: xmlCharPtr; out cleaned: AnsiString): boolean;
  234. implementation
  235. constructor XSDException.CreateNode(const Msg: String; name, nameSpace: xmlCharPtr);
  236. var
  237. S: String;
  238. begin
  239. S := PAnsiChar(name);
  240. if Assigned(nameSpace) then
  241. S := PAnsiChar(nameSpace)+':'+S;
  242. inherited CreateFmt(Msg, [S]);
  243. end;
  244. function xsdNewChildBase64(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: TStream): xmlNodePtr;
  245. var
  246. Tmp: AnsiString;
  247. begin
  248. Tmp := xsdFormatBase64(Value);
  249. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  250. end;
  251. function xsdNewChildCData(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: AnsiString): xmlNodePtr;
  252. begin
  253. Result := xmlNewNode(ns, name);
  254. xmlAddChild(Result, xmlNewCDataBlock(parent^.doc, PAnsiChar(Value), Length(Value)));
  255. xmlAddChild(parent, Result);
  256. end;
  257. function xsdNewChildString(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: AnsiString): xmlNodePtr;
  258. begin
  259. Result := xmlNewChild(parent, ns, name, PAnsiChar(Value));
  260. end;
  261. function xsdNewChildBoolean(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Boolean; UseWords: Boolean): xmlNodePtr;
  262. var
  263. Tmp: AnsiString;
  264. begin
  265. Tmp := xsdFormatBoolean(Value, UseWords);
  266. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  267. end;
  268. function xsdNewChildTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone): xmlNodePtr;
  269. var
  270. Tmp: AnsiString;
  271. begin
  272. Tmp := xsdFormatTime(Hour, Minute, Second, Milliseconds, Timezone);
  273. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  274. end;
  275. function xsdNewChildTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Time: TDateTime; Timezone: PXsdTimezone): xmlNodePtr;
  276. var
  277. Tmp: AnsiString;
  278. begin
  279. Tmp := xsdFormatTime(Time, Timezone);
  280. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  281. end;
  282. function xsdNewChildDate(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day: Longword; BC: Boolean; Timezone: PXsdTimezone): xmlNodePtr;
  283. var
  284. Tmp: AnsiString;
  285. begin
  286. Tmp := xsdFormatDate(Year, Month, Day, BC, Timezone);
  287. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  288. end;
  289. function xsdNewChildDate(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Date: TDateTime; Timezone: PXsdTimezone): xmlNodePtr;
  290. var
  291. Tmp: AnsiString;
  292. begin
  293. Tmp := xsdFormatDate(Date, Timezone);
  294. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  295. end;
  296. function xsdNewChildDateTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day, Hour, Minute, Second, Milliseconds: Longword; BC: Boolean; Timezone: PXsdTimezone): xmlNodePtr;
  297. var
  298. Tmp: AnsiString;
  299. begin
  300. Tmp := xsdFormatDateTime(Year, Month, Day, Hour, Minute, Second, Milliseconds, BC, Timezone);
  301. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  302. end;
  303. function xsdNewChildDateTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; DateTime: TDateTime; Timezone: PXsdTimezone): xmlNodePtr;
  304. var
  305. Tmp: AnsiString;
  306. begin
  307. Tmp := xsdFormatDateTime(DateTime, Timezone);
  308. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  309. end;
  310. function xsdNewChildDecimal(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Extended; Precision: Integer; Digits: Integer): xmlNodePtr;
  311. var
  312. Tmp: AnsiString;
  313. begin
  314. Tmp := xsdFormatDecimal(Value, Precision, Digits);
  315. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  316. end;
  317. function xsdNewChildDouble(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Double): xmlNodePtr;
  318. var
  319. Tmp: AnsiString;
  320. begin
  321. Tmp := xsdFormatDouble(Value);
  322. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  323. end;
  324. function xsdNewChildFloat(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Single): xmlNodePtr;
  325. var
  326. Tmp: AnsiString;
  327. begin
  328. Tmp := xsdFormatFloat(Value);
  329. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  330. end;
  331. function xsdNewChildByte(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Shortint): xmlNodePtr;
  332. var
  333. Tmp: AnsiString;
  334. begin
  335. Tmp := xsdFormatByte(Value);
  336. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  337. end;
  338. function xsdNewChildShort(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Smallint): xmlNodePtr;
  339. var
  340. Tmp: AnsiString;
  341. begin
  342. Tmp := xsdFormatShort(Value);
  343. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  344. end;
  345. function xsdNewChildInt(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longint): xmlNodePtr;
  346. var
  347. Tmp: AnsiString;
  348. begin
  349. Tmp := xsdFormatInt(Value);
  350. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  351. end;
  352. function xsdNewChildLong(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Int64): xmlNodePtr;
  353. var
  354. Tmp: AnsiString;
  355. begin
  356. Tmp := xsdFormatLong(Value);
  357. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  358. end;
  359. function xsdNewChildUnsignedByte(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Byte): xmlNodePtr;
  360. var
  361. Tmp: AnsiString;
  362. begin
  363. Tmp := xsdFormatUnsignedByte(Value);
  364. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  365. end;
  366. function xsdNewChildUnsignedShort(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Word): xmlNodePtr;
  367. var
  368. Tmp: AnsiString;
  369. begin
  370. Tmp := xsdFormatUnsignedShort(Value);
  371. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  372. end;
  373. function xsdNewChildUnsignedInt(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longword): xmlNodePtr;
  374. var
  375. Tmp: AnsiString;
  376. begin
  377. Tmp := xsdFormatUnsignedInt(Value);
  378. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  379. end;
  380. function xsdNewChildUnsignedLong(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: QWord): xmlNodePtr;
  381. var
  382. Tmp: AnsiString;
  383. begin
  384. Tmp := xsdFormatUnsignedLong(Value);
  385. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  386. end;
  387. function xsdNewChildEnum(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; enum: array of AnsiString; Value: Integer): xmlNodePtr;
  388. var
  389. Tmp: AnsiString;
  390. begin
  391. Tmp := xsdFormatEnum(enum, Value);
  392. Result := xmlNewChild(parent, ns, name, PAnsiChar(Tmp));
  393. end;
  394. function xsdNewPropString(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: AnsiString): xmlAttrPtr;
  395. begin
  396. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Value));
  397. end;
  398. function xsdNewPropBoolean(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Boolean; UseWords: Boolean): xmlAttrPtr;
  399. var
  400. Tmp: AnsiString;
  401. begin
  402. Tmp := xsdFormatBoolean(Value, UseWords);
  403. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  404. end;
  405. function xsdNewPropTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone): xmlAttrPtr;
  406. var
  407. Tmp: AnsiString;
  408. begin
  409. Tmp := xsdFormatTime(Hour, Minute, Second, Milliseconds, Timezone);
  410. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  411. end;
  412. function xsdNewPropTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Time: TDateTime; Timezone: PXsdTimezone): xmlAttrPtr;
  413. var
  414. Tmp: AnsiString;
  415. begin
  416. Tmp := xsdFormatTime(Time, Timezone);
  417. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  418. end;
  419. function xsdNewPropDate(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day: Longword; BC: Boolean; Timezone: PXsdTimezone): xmlAttrPtr;
  420. var
  421. Tmp: AnsiString;
  422. begin
  423. Tmp := xsdFormatDate(Year, Month, Day, BC, Timezone);
  424. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  425. end;
  426. function xsdNewPropDate(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Date: TDateTime; Timezone: PXsdTimezone): xmlAttrPtr;
  427. var
  428. Tmp: AnsiString;
  429. begin
  430. Tmp := xsdFormatDate(Date, Timezone);
  431. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  432. end;
  433. function xsdNewPropDateTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day, Hour, Minute, Second, Milliseconds: Longword; BC: Boolean; Timezone: PXsdTimezone): xmlAttrPtr;
  434. var
  435. Tmp: AnsiString;
  436. begin
  437. Tmp := xsdFormatDateTime(Year, Month, Day, Hour, Minute, Second, Milliseconds, BC, Timezone);
  438. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  439. end;
  440. function xsdNewPropDateTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; DateTime: TDateTime; Timezone: PXsdTimezone): xmlAttrPtr;
  441. var
  442. Tmp: AnsiString;
  443. begin
  444. Tmp := xsdFormatDateTime(DateTime, Timezone);
  445. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  446. end;
  447. function xsdNewPropDecimal(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Extended; Precision: Integer; Digits: Integer): xmlAttrPtr;
  448. var
  449. Tmp: AnsiString;
  450. begin
  451. Tmp := xsdFormatDecimal(Value, Precision, Digits);
  452. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  453. end;
  454. function xsdNewPropDouble(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Double): xmlAttrPtr;
  455. var
  456. Tmp: AnsiString;
  457. begin
  458. Tmp := xsdFormatDouble(Value);
  459. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  460. end;
  461. function xsdNewPropFloat(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Single): xmlAttrPtr;
  462. var
  463. Tmp: AnsiString;
  464. begin
  465. Tmp := xsdFormatFloat(Value);
  466. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  467. end;
  468. function xsdNewPropByte(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Shortint): xmlAttrPtr;
  469. var
  470. Tmp: AnsiString;
  471. begin
  472. Tmp := xsdFormatByte(Value);
  473. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  474. end;
  475. function xsdNewPropShort(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Smallint): xmlAttrPtr;
  476. var
  477. Tmp: AnsiString;
  478. begin
  479. Tmp := xsdFormatShort(Value);
  480. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  481. end;
  482. function xsdNewPropInt(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longint): xmlAttrPtr;
  483. var
  484. Tmp: AnsiString;
  485. begin
  486. Tmp := xsdFormatInt(Value);
  487. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  488. end;
  489. function xsdNewPropLong(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Int64): xmlAttrPtr;
  490. var
  491. Tmp: AnsiString;
  492. begin
  493. Tmp := xsdFormatLong(Value);
  494. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  495. end;
  496. function xsdNewPropUnsignedByte(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Byte): xmlAttrPtr;
  497. var
  498. Tmp: AnsiString;
  499. begin
  500. Tmp := xsdFormatUnsignedByte(Value);
  501. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  502. end;
  503. function xsdNewPropUnsignedShort(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Word): xmlAttrPtr;
  504. var
  505. Tmp: AnsiString;
  506. begin
  507. Tmp := xsdFormatUnsignedShort(Value);
  508. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  509. end;
  510. function xsdNewPropUnsignedInt(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longword): xmlAttrPtr;
  511. var
  512. Tmp: AnsiString;
  513. begin
  514. Tmp := xsdFormatUnsignedInt(Value);
  515. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  516. end;
  517. function xsdNewPropUnsignedLong(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: QWord): xmlAttrPtr;
  518. var
  519. Tmp: AnsiString;
  520. begin
  521. Tmp := xsdFormatUnsignedLong(Value);
  522. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  523. end;
  524. function xsdNewPropEnum(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; enum: array of AnsiString; Value: Integer): xmlAttrPtr;
  525. var
  526. Tmp: AnsiString;
  527. begin
  528. Tmp := xsdFormatEnum(enum, Value);
  529. Result := xmlNewNsProp(node, ns, name, PAnsiChar(Tmp));
  530. end;
  531. function xsdTestNodeNs(node: xmlNodePtr; nameSpace: xmlCharPtr): Boolean;
  532. begin
  533. Result :=
  534. (nameSpace = NS_IGNORE) or
  535. ((nameSpace = NS_EXCLUDE) and (node^.ns = nil)) or
  536. ((nameSpace <> NS_EXCLUDE) and (nameSpace <> NS_IGNORE) and (node^.ns <> nil) and (xmlStrEqual(nameSpace, node^.ns^.href) <> 0));
  537. end;
  538. function xsdTestNode(node: xmlNodePtr; name, nameSpace: xmlCharPtr): Boolean;
  539. begin
  540. Result := (node <> nil) and (xmlStrEqual(name, node^.name) <> 0) and xsdTestNodeNs(node, nameSpace);
  541. end;
  542. function xsdTryGetChild(node: xmlNodePtr; name, nameSpace: xmlCharPtr; Index: integer): xmlNodePtr;
  543. begin
  544. if Assigned(node) and (Index >= 0) then
  545. begin
  546. Result := node^.children;
  547. while Assigned(Result) do
  548. begin
  549. if xsdTestNode(Result, name, nameSpace) then
  550. begin
  551. if Index = 0 then
  552. Exit;
  553. Dec(Index);
  554. end;
  555. Result := Result^.next;
  556. end;
  557. end else
  558. Result := nil;
  559. end;
  560. function xsdTryGetChild(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out child: xmlNodePtr; Index: Integer): Boolean;
  561. begin
  562. child := xsdTryGetChild(node, name, nameSpace, Index);
  563. Result := Assigned(child);
  564. end;
  565. function xsdTryGetChildChars(node: xmlNodePtr; name, nameSpace: xmlCharPtr; Index: Integer): xmlCharPtr;
  566. begin
  567. Result := xmlNodeGetContent(xsdTryGetChild(node, name, nameSpace, Index));
  568. end;
  569. function xsdTryGetChildBase64(node: xmlNodePtr; name, nameSpace: xmlCharPtr; const Value: TStream; Index: Integer): Boolean;
  570. begin
  571. Result := xsdTryParseBase64(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value);
  572. end;
  573. function xsdTryGetChildString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: AnsiString; Index: Integer): Boolean;
  574. begin
  575. Result := xsdTryParseString(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value);
  576. end;
  577. function xsdTryGetChildBoolean(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Boolean; Index: Integer): Boolean;
  578. begin
  579. Result := xsdTryParseBoolean(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value);
  580. end;
  581. function xsdTryGetChildDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day: Longword; Timezone: PXsdTimezone; BC: PBoolean; Index: Integer): Boolean;
  582. begin
  583. Result := xsdTryParseDate(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Year, Month, Day, Timezone, BC);
  584. end;
  585. function xsdTryGetChildDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone; Index: Integer): Boolean;
  586. begin
  587. Result := xsdTryParseDate(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value, Timezone);
  588. end;
  589. function xsdTryGetChildTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone; Index: Integer): Boolean;
  590. begin
  591. Result := xsdTryParseTime(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Hour, Minute, Second, Milliseconds, Timezone);
  592. end;
  593. function xsdTryGetChildTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone; Index: Integer): Boolean;
  594. begin
  595. Result := xsdTryParseTime(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value, Timezone);
  596. end;
  597. function xsdTryGetChildDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day, Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone; BC: PBoolean; Index: Integer): Boolean;
  598. begin
  599. Result := xsdTryParseDateTime(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Year, Month, Day, Hour, Minute, Second, Milliseconds, Timezone, BC);
  600. end;
  601. function xsdTryGetChildDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone; Index: Integer): Boolean;
  602. begin
  603. Result := xsdTryParseDateTime(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value, Timezone);
  604. end;
  605. function xsdTryGetChildDecimal(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Extended; Index: Integer): Boolean;
  606. begin
  607. Result := xsdTryParseDecimal(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value);
  608. end;
  609. function xsdTryGetChildDouble(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Double; Index: Integer): Boolean;
  610. begin
  611. Result := xsdTryParseDouble(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value);
  612. end;
  613. function xsdTryGetChildFloat(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Single; Index: Integer): Boolean;
  614. begin
  615. Result := xsdTryParseFloat(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value);
  616. end;
  617. function xsdTryGetChildByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Shortint; Index: Integer): Boolean;
  618. begin
  619. Result := xsdTryParseByte(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value);
  620. end;
  621. function xsdTryGetChildShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Smallint; Index: Integer): Boolean;
  622. begin
  623. Result := xsdTryParseShort(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value);
  624. end;
  625. function xsdTryGetChildInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longint; Index: Integer): Boolean;
  626. begin
  627. Result := xsdTryParseInt(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value);
  628. end;
  629. function xsdTryGetChildLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Int64; Index: Integer): Boolean;
  630. begin
  631. Result := xsdTryParseLong(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value);
  632. end;
  633. function xsdTryGetChildUnsignedByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Byte; Index: Integer): Boolean;
  634. begin
  635. Result := xsdTryParseUnsignedByte(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value);
  636. end;
  637. function xsdTryGetChildUnsignedShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Word; Index: Integer): Boolean;
  638. begin
  639. Result := xsdTryParseUnsignedShort(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value);
  640. end;
  641. function xsdTryGetChildUnsignedInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longword; Index: Integer): Boolean;
  642. begin
  643. Result := xsdTryParseUnsignedInt(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value);
  644. end;
  645. function xsdTryGetChildUnsignedLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: QWord; Index: Integer): Boolean;
  646. begin
  647. Result := xsdTryParseUnsignedLong(xsdTryGetChildChars(node, name, nameSpace, Index), -1, Value);
  648. end;
  649. function xsdTryGetChildEnum(node: xmlNodePtr; name, nameSpace: xmlCharPtr; enum: array of AnsiString; out Value: Integer; Index: Integer): Boolean;
  650. begin
  651. Result := xsdTryParseEnum(xsdTryGetChildChars(node, name, nameSpace, Index), -1, enum, Value);
  652. end;
  653. function xsdGetChild(node: xmlNodePtr; name, nameSpace: xmlCharPtr; Index: Integer): xmlNodePtr;
  654. begin
  655. Result := xsdTryGetChild(node, name, nameSpace, Index);
  656. if not Assigned(Result) then
  657. raise XSDException.CreateNode(SChildNotFound, name, nameSpace);
  658. end;
  659. function xsdGetChildChars(node: xmlNodePtr; name, nameSpace: xmlCharPtr; Index: Integer): xmlCharPtr;
  660. begin
  661. Result := xmlNodeGetContent(xsdGetChild(node, name, nameSpace, Index));
  662. end;
  663. procedure xsdGetChildBase64(node: xmlNodePtr; name, nameSpace: xmlCharPtr; const Value: TStream; Index: Integer);
  664. begin
  665. xsdParseBase64(xsdGetChildChars(node, name, nameSpace, Index), -1, Value);
  666. end;
  667. procedure xsdGetChildString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: AnsiString; Index: Integer);
  668. begin
  669. xsdParseString(xsdGetChildChars(node, name, nameSpace, Index), -1, Value);
  670. end;
  671. procedure xsdGetChildBoolean(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Boolean; Index: Integer);
  672. begin
  673. xsdParseBoolean(xsdGetChildChars(node, name, nameSpace, Index), -1, Value);
  674. end;
  675. procedure xsdGetChildDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day: Longword; Timezone: PXsdTimezone; BC: PBoolean; Index: Integer);
  676. begin
  677. xsdParseDate(xsdGetChildChars(node, name, nameSpace, Index), -1, Year, Month, Day, Timezone, BC);
  678. end;
  679. procedure xsdGetChildDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone; Index: Integer);
  680. begin
  681. xsdParseDate(xsdGetChildChars(node, name, nameSpace, Index), -1, Value, Timezone);
  682. end;
  683. procedure xsdGetChildTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone; Index: Integer);
  684. begin
  685. xsdParseTime(xsdGetChildChars(node, name, nameSpace, Index), -1, Hour, Minute, Second, Milliseconds, Timezone);
  686. end;
  687. procedure xsdGetChildTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone; Index: Integer);
  688. begin
  689. xsdParseTime(xsdGetChildChars(node, name, nameSpace, Index), -1, Value, Timezone);
  690. end;
  691. procedure xsdGetChildDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day, Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone; BC: PBoolean; Index: Integer);
  692. begin
  693. xsdParseDateTime(xsdGetChildChars(node, name, nameSpace, Index), -1, Year, Month, Day, Hour, Minute, Second, Milliseconds, Timezone, BC);
  694. end;
  695. procedure xsdGetChildDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone; Index: Integer);
  696. begin
  697. xsdParseDateTime(xsdGetChildChars(node, name, nameSpace, Index), -1, Value, Timezone);
  698. end;
  699. procedure xsdGetChildDecimal(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Extended; Index: Integer);
  700. begin
  701. xsdParseDecimal(xsdGetChildChars(node, name, nameSpace, Index), -1, Value);
  702. end;
  703. procedure xsdGetChildDouble(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Double; Index: Integer);
  704. begin
  705. xsdParseDouble(xsdGetChildChars(node, name, nameSpace, Index), -1, Value);
  706. end;
  707. procedure xsdGetChildFloat(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Single; Index: Integer);
  708. begin
  709. xsdParseFloat(xsdGetChildChars(node, name, nameSpace, Index), -1, Value);
  710. end;
  711. procedure xsdGetChildByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Shortint; Index: Integer);
  712. begin
  713. xsdParseByte(xsdGetChildChars(node, name, nameSpace, Index), -1, Value);
  714. end;
  715. procedure xsdGetChildShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Smallint; Index: Integer);
  716. begin
  717. xsdParseShort(xsdGetChildChars(node, name, nameSpace, Index), -1, Value);
  718. end;
  719. procedure xsdGetChildInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longint; Index: Integer);
  720. begin
  721. xsdParseInt(xsdGetChildChars(node, name, nameSpace, Index), -1, Value);
  722. end;
  723. procedure xsdGetChildLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Int64; Index: Integer);
  724. begin
  725. xsdParseLong(xsdGetChildChars(node, name, nameSpace, Index), -1, Value);
  726. end;
  727. procedure xsdGetChildUnsignedByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Byte; Index: Integer);
  728. begin
  729. xsdParseUnsignedByte(xsdGetChildChars(node, name, nameSpace, Index), -1, Value);
  730. end;
  731. procedure xsdGetChildUnsignedShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Word; Index: Integer);
  732. begin
  733. xsdParseUnsignedShort(xsdGetChildChars(node, name, nameSpace, Index), -1, Value);
  734. end;
  735. procedure xsdGetChildUnsignedInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longword; Index: Integer);
  736. begin
  737. xsdParseUnsignedInt(xsdGetChildChars(node, name, nameSpace, Index), -1, Value);
  738. end;
  739. procedure xsdGetChildUnsignedLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: QWord; Index: Integer);
  740. begin
  741. xsdParseUnsignedLong(xsdGetChildChars(node, name, nameSpace, Index), -1, Value);
  742. end;
  743. procedure xsdGetChildEnum(node: xmlNodePtr; name, nameSpace: xmlCharPtr; enum: array of AnsiString; out Value: Integer; Index: Integer);
  744. begin
  745. xsdParseEnum(xsdGetChildChars(node, name, nameSpace, Index), -1, enum, Value);
  746. end;
  747. function xsdTryNext(var node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlNodePtr;
  748. begin
  749. while Assigned(node) and (node^._type = XML_TEXT_NODE) do
  750. node := node^.next;
  751. if xsdTestNode(node, name, nameSpace) then
  752. begin
  753. Result := node;
  754. node := node^.next;
  755. end else
  756. Result := nil;
  757. end;
  758. function xsdTryNext(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out last: xmlNodePtr): Boolean;
  759. begin
  760. last := xsdTryNext(node, name, nameSpace);
  761. Result := Assigned(last);
  762. end;
  763. function xsdTryNextChars(var node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlCharPtr;
  764. begin
  765. Result := xmlNodeGetContent(xsdTryNext(node, name, nameSpace));
  766. end;
  767. function xsdTryNextBase64(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; const Value: TStream): Boolean;
  768. begin
  769. Result := xsdTryParseBase64(xsdTryNextChars(node, name, nameSpace), -1, Value);
  770. end;
  771. function xsdTryNextString(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: AnsiString): Boolean;
  772. begin
  773. Result := xsdTryParseString(xsdTryNextChars(node, name, nameSpace), -1, Value);
  774. end;
  775. function xsdTryNextBoolean(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Boolean): Boolean;
  776. begin
  777. Result := xsdTryParseBoolean(xsdTryNextChars(node, name, nameSpace), -1, Value);
  778. end;
  779. function xsdTryNextDate(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day: Longword; Timezone: PXsdTimezone; BC: PBoolean): Boolean;
  780. begin
  781. Result := xsdTryParseDate(xsdTryNextChars(node, name, nameSpace), -1, Year, Month, Day, Timezone, BC);
  782. end;
  783. function xsdTryNextDate(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone): Boolean;
  784. begin
  785. Result := xsdTryParseDate(xsdTryNextChars(node, name, nameSpace), -1, Value, Timezone);
  786. end;
  787. function xsdTryNextTime(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone): Boolean;
  788. begin
  789. Result := xsdTryParseTime(xsdTryNextChars(node, name, nameSpace), -1, Hour, Minute, Second, Milliseconds, Timezone);
  790. end;
  791. function xsdTryNextTime(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone): Boolean;
  792. begin
  793. Result := xsdTryParseTime(xsdTryNextChars(node, name, nameSpace), -1, Value, Timezone);
  794. end;
  795. function xsdTryNextDateTime(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day, Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone; BC: PBoolean): Boolean;
  796. begin
  797. Result := xsdTryParseDateTime(xsdTryNextChars(node, name, nameSpace), -1, Year, Month, Day, Hour, Minute, Second, Milliseconds, Timezone, BC);
  798. end;
  799. function xsdTryNextDateTime(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone): Boolean;
  800. begin
  801. Result := xsdTryParseDateTime(xsdTryNextChars(node, name, nameSpace), -1, Value, Timezone);
  802. end;
  803. function xsdTryNextDecimal(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Extended): Boolean;
  804. begin
  805. Result := xsdTryParseDecimal(xsdTryNextChars(node, name, nameSpace), -1, Value);
  806. end;
  807. function xsdTryNextDouble(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Double): Boolean;
  808. begin
  809. Result := xsdTryParseDouble(xsdTryNextChars(node, name, nameSpace), -1, Value);
  810. end;
  811. function xsdTryNextFloat(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Single): Boolean;
  812. begin
  813. Result := xsdTryParseFloat(xsdTryNextChars(node, name, nameSpace), -1, Value);
  814. end;
  815. function xsdTryNextByte(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Shortint): Boolean;
  816. begin
  817. Result := xsdTryParseByte(xsdTryNextChars(node, name, nameSpace), -1, Value);
  818. end;
  819. function xsdTryNextShort(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Smallint): Boolean;
  820. begin
  821. Result := xsdTryParseShort(xsdTryNextChars(node, name, nameSpace), -1, Value);
  822. end;
  823. function xsdTryNextInt(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longint): Boolean;
  824. begin
  825. Result := xsdTryParseInt(xsdTryNextChars(node, name, nameSpace), -1, Value);
  826. end;
  827. function xsdTryNextLong(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Int64): Boolean;
  828. begin
  829. Result := xsdTryParseLong(xsdTryNextChars(node, name, nameSpace), -1, Value);
  830. end;
  831. function xsdTryNextUnsignedByte(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Byte): Boolean;
  832. begin
  833. Result := xsdTryParseUnsignedByte(xsdTryNextChars(node, name, nameSpace), -1, Value);
  834. end;
  835. function xsdTryNextUnsignedShort(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Word): Boolean;
  836. begin
  837. Result := xsdTryParseUnsignedShort(xsdTryNextChars(node, name, nameSpace), -1, Value);
  838. end;
  839. function xsdTryNextUnsignedInt(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longword): Boolean;
  840. begin
  841. Result := xsdTryParseUnsignedInt(xsdTryNextChars(node, name, nameSpace), -1, Value);
  842. end;
  843. function xsdTryNextUnsignedLong(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: QWord): Boolean;
  844. begin
  845. Result := xsdTryParseUnsignedLong(xsdTryNextChars(node, name, nameSpace), -1, Value);
  846. end;
  847. function xsdTryNextEnum(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; enum: array of AnsiString; out Value: Integer): Boolean;
  848. begin
  849. Result := xsdTryParseEnum(xsdTryNextChars(node, name, nameSpace), -1, enum, Value);
  850. end;
  851. function xsdNext(var node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlNodePtr;
  852. begin
  853. Result := xsdTryNext(node, name, nameSpace);
  854. if not Assigned(Result) then
  855. raise XSDException.CreateNode(SChildNotFound, name, nameSpace);
  856. end;
  857. function xsdNextChars(var node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlCharPtr;
  858. begin
  859. Result := xmlNodeGetContent(xsdNext(node, name, nameSpace));
  860. end;
  861. procedure xsdNextBase64(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; const Value: TStream);
  862. begin
  863. xsdParseBase64(xsdNextChars(node, name, nameSpace), -1, Value);
  864. end;
  865. procedure xsdNextString(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: AnsiString);
  866. begin
  867. xsdParseString(xsdNextChars(node, name, nameSpace), -1, Value);
  868. end;
  869. procedure xsdNextBoolean(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Boolean);
  870. begin
  871. xsdParseBoolean(xsdNextChars(node, name, nameSpace), -1, Value);
  872. end;
  873. procedure xsdNextDate(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day: Longword; Timezone: PXsdTimezone; BC: PBoolean);
  874. begin
  875. xsdParseDate(xsdNextChars(node, name, nameSpace), -1, Year, Month, Day, Timezone, BC);
  876. end;
  877. procedure xsdNextDate(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone);
  878. begin
  879. xsdParseDate(xsdNextChars(node, name, nameSpace), -1, Value, Timezone);
  880. end;
  881. procedure xsdNextTime(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone);
  882. begin
  883. xsdParseTime(xsdNextChars(node, name, nameSpace), -1, Hour, Minute, Second, Milliseconds, Timezone);
  884. end;
  885. procedure xsdNextTime(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone);
  886. begin
  887. xsdParseTime(xsdNextChars(node, name, nameSpace), -1, Value, Timezone);
  888. end;
  889. procedure xsdNextDateTime(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day, Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone; BC: PBoolean);
  890. begin
  891. xsdParseDateTime(xsdNextChars(node, name, nameSpace), -1, Year, Month, Day, Hour, Minute, Second, Milliseconds, Timezone, BC);
  892. end;
  893. procedure xsdNextDateTime(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone);
  894. begin
  895. xsdParseDateTime(xsdNextChars(node, name, nameSpace), -1, Value, Timezone);
  896. end;
  897. procedure xsdNextDecimal(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Extended);
  898. begin
  899. xsdParseDecimal(xsdNextChars(node, name, nameSpace), -1, Value);
  900. end;
  901. procedure xsdNextDouble(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Double);
  902. begin
  903. xsdParseDouble(xsdNextChars(node, name, nameSpace), -1, Value);
  904. end;
  905. procedure xsdNextFloat(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Single);
  906. begin
  907. xsdParseFloat(xsdNextChars(node, name, nameSpace), -1, Value);
  908. end;
  909. procedure xsdNextByte(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Shortint);
  910. begin
  911. xsdParseByte(xsdNextChars(node, name, nameSpace), -1, Value);
  912. end;
  913. procedure xsdNextShort(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Smallint);
  914. begin
  915. xsdParseShort(xsdNextChars(node, name, nameSpace), -1, Value);
  916. end;
  917. procedure xsdNextInt(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longint);
  918. begin
  919. xsdParseInt(xsdNextChars(node, name, nameSpace), -1, Value);
  920. end;
  921. procedure xsdNextLong(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Int64);
  922. begin
  923. xsdParseLong(xsdNextChars(node, name, nameSpace), -1, Value);
  924. end;
  925. procedure xsdNextUnsignedByte(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Byte);
  926. begin
  927. xsdParseUnsignedByte(xsdNextChars(node, name, nameSpace), -1, Value);
  928. end;
  929. procedure xsdNextUnsignedShort(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Word);
  930. begin
  931. xsdParseUnsignedShort(xsdNextChars(node, name, nameSpace), -1, Value);
  932. end;
  933. procedure xsdNextUnsignedInt(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longword);
  934. begin
  935. xsdParseUnsignedInt(xsdNextChars(node, name, nameSpace), -1, Value);
  936. end;
  937. procedure xsdNextUnsignedLong(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: QWord);
  938. begin
  939. xsdParseUnsignedLong(xsdNextChars(node, name, nameSpace), -1, Value);
  940. end;
  941. procedure xsdNextEnum(var node: xmlNodePtr; name, nameSpace: xmlCharPtr; enum: array of AnsiString; out Value: Integer);
  942. begin
  943. xsdParseEnum(xsdNextChars(node, name, nameSpace), -1, enum, Value);
  944. end;
  945. function xsdTestPropNs(attr: xmlAttrPtr; nameSpace: xmlCharPtr): Boolean;
  946. begin
  947. Result :=
  948. (nameSpace = NS_IGNORE) or
  949. ((nameSpace = NS_EXCLUDE) and (attr^.ns = nil)) or
  950. ((nameSpace <> NS_EXCLUDE) and (nameSpace <> NS_IGNORE) and (attr^.ns <> nil) and (xmlStrEqual(nameSpace, attr^.ns^.href) <> 0))
  951. end;
  952. function xsdTestProp(attr: xmlAttrPtr; name, nameSpace: xmlCharPtr): Boolean;
  953. begin
  954. Result := (attr <> nil) and (xmlStrEqual(name, attr^.name) <> 0) and xsdTestPropNs(attr, nameSpace);
  955. end;
  956. function xsdTryGetProp(node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlAttrPtr;
  957. begin
  958. if Assigned(node) then
  959. begin
  960. Result := node^.properties;
  961. while Assigned(Result) do
  962. begin
  963. if xsdTestProp(Result, name, nameSpace) then
  964. Exit;
  965. Result := Result^.next;
  966. end;
  967. end else
  968. Result := nil;
  969. end;
  970. function xsdTryGetPropChars(node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlCharPtr;
  971. var
  972. Prop: xmlAttrPtr;
  973. begin
  974. Prop := xsdTryGetProp(node, name, nameSpace);
  975. if Assigned(Prop) then
  976. Result := xmlNodeGetContent(Prop^.children)
  977. else
  978. Result := nil;
  979. end;
  980. function xsdTryGetPropString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: AnsiString): Boolean;
  981. begin
  982. Result := xsdTryParseString(xsdTryGetPropChars(node, name, nameSpace), -1, Value);
  983. end;
  984. function xsdTryGetPropBoolean(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Boolean): Boolean;
  985. begin
  986. Result := xsdTryParseBoolean(xsdTryGetPropChars(node, name, nameSpace), -1, Value);
  987. end;
  988. function xsdTryGetPropDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day: Longword; Timezone: PXsdTimezone; BC: PBoolean): Boolean;
  989. begin
  990. Result := xsdTryParseDate(xsdTryGetPropChars(node, name, nameSpace), -1, Year, Month, Day, Timezone, BC);
  991. end;
  992. function xsdTryGetPropDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone): Boolean;
  993. begin
  994. Result := xsdTryParseDate(xsdTryGetPropChars(node, name, nameSpace), -1, Value, Timezone);
  995. end;
  996. function xsdTryGetPropTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone): Boolean;
  997. begin
  998. Result := xsdTryParseTime(xsdTryGetPropChars(node, name, nameSpace), -1, Hour, Minute, Second, Milliseconds, Timezone);
  999. end;
  1000. function xsdTryGetPropTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone): Boolean;
  1001. begin
  1002. Result := xsdTryParseTime(xsdTryGetPropChars(node, name, nameSpace), -1, Value, Timezone);
  1003. end;
  1004. function xsdTryGetPropDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day, Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone; BC: PBoolean): Boolean;
  1005. begin
  1006. Result := xsdTryParseDateTime(xsdTryGetPropChars(node, name, nameSpace), -1, Year, Month, Day, Hour, Minute, Second, Milliseconds, Timezone, BC);
  1007. end;
  1008. function xsdTryGetPropDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone): Boolean;
  1009. begin
  1010. Result := xsdTryParseDateTime(xsdTryGetPropChars(node, name, nameSpace), -1, Value, Timezone);
  1011. end;
  1012. function xsdTryGetPropDecimal(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Extended): Boolean;
  1013. begin
  1014. Result := xsdTryParseDecimal(xsdTryGetPropChars(node, name, nameSpace), -1, Value);
  1015. end;
  1016. function xsdTryGetPropDouble(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Double): Boolean;
  1017. begin
  1018. Result := xsdTryParseDouble(xsdTryGetPropChars(node, name, nameSpace), -1, Value);
  1019. end;
  1020. function xsdTryGetPropFloat(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Single): Boolean;
  1021. begin
  1022. Result := xsdTryParseFloat(xsdTryGetPropChars(node, name, nameSpace), -1, Value);
  1023. end;
  1024. function xsdTryGetPropByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Shortint): Boolean;
  1025. begin
  1026. Result := xsdTryParseByte(xsdTryGetPropChars(node, name, nameSpace), -1, Value);
  1027. end;
  1028. function xsdTryGetPropShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Smallint): Boolean;
  1029. begin
  1030. Result := xsdTryParseShort(xsdTryGetPropChars(node, name, nameSpace), -1, Value);
  1031. end;
  1032. function xsdTryGetPropInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longint): Boolean;
  1033. begin
  1034. Result := xsdTryParseInt(xsdTryGetPropChars(node, name, nameSpace), -1, Value);
  1035. end;
  1036. function xsdTryGetPropLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Int64): Boolean;
  1037. begin
  1038. Result := xsdTryParseLong(xsdTryGetPropChars(node, name, nameSpace), -1, Value);
  1039. end;
  1040. function xsdTryGetPropUnsignedByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Byte): Boolean;
  1041. begin
  1042. Result := xsdTryParseUnsignedByte(xsdTryGetPropChars(node, name, nameSpace), -1, Value);
  1043. end;
  1044. function xsdTryGetPropUnsignedShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Word): Boolean;
  1045. begin
  1046. Result := xsdTryParseUnsignedShort(xsdTryGetPropChars(node, name, nameSpace), -1, Value);
  1047. end;
  1048. function xsdTryGetPropUnsignedInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longword): Boolean;
  1049. begin
  1050. Result := xsdTryParseUnsignedInt(xsdTryGetPropChars(node, name, nameSpace), -1, Value);
  1051. end;
  1052. function xsdTryGetPropUnsignedLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: QWord): Boolean;
  1053. begin
  1054. Result := xsdTryParseUnsignedLong(xsdTryGetPropChars(node, name, nameSpace), -1, Value);
  1055. end;
  1056. function xsdTryGetPropEnum(node: xmlNodePtr; name, nameSpace: xmlCharPtr; enum: array of AnsiString; out Value: Integer): Boolean;
  1057. begin
  1058. Result := xsdTryParseEnum(xsdTryGetPropChars(node, name, nameSpace), -1, enum, Value);
  1059. end;
  1060. function xsdGetProp(node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlAttrPtr;
  1061. begin
  1062. Result := xsdTryGetProp(node, name, nameSpace);
  1063. if not Assigned(Result) then
  1064. raise XSDException.CreateNode(SPropNotFound, name, nameSpace);
  1065. end;
  1066. function xsdGetPropChars(node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlCharPtr;
  1067. begin
  1068. Result := xmlNodeGetContent(xsdGetProp(node, name, nameSpace)^.children);
  1069. end;
  1070. procedure xsdGetPropString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: AnsiString);
  1071. begin
  1072. xsdParseString(xsdGetPropChars(node, name, nameSpace), -1, Value);
  1073. end;
  1074. procedure xsdGetPropBoolean(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Boolean);
  1075. begin
  1076. xsdParseBoolean(xsdGetPropChars(node, name, nameSpace), -1, Value);
  1077. end;
  1078. procedure xsdGetPropDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day: Longword; Timezone: PXsdTimezone; BC: PBoolean);
  1079. begin
  1080. xsdParseDate(xsdGetPropChars(node, name, nameSpace), -1, Year, Month, Day, Timezone, BC);
  1081. end;
  1082. procedure xsdGetPropDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone);
  1083. begin
  1084. xsdParseDate(xsdGetPropChars(node, name, nameSpace), -1, Value, Timezone);
  1085. end;
  1086. procedure xsdGetPropTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone);
  1087. begin
  1088. xsdParseTime(xsdGetPropChars(node, name, nameSpace), -1, Hour, Minute, Second, Milliseconds, Timezone);
  1089. end;
  1090. procedure xsdGetPropTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone);
  1091. begin
  1092. xsdParseTime(xsdGetPropChars(node, name, nameSpace), -1, Value, Timezone);
  1093. end;
  1094. procedure xsdGetPropDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Year, Month, Day, Hour, Minute, Second, Milliseconds: Longword; Timezone: PXsdTimezone; BC: PBoolean);
  1095. begin
  1096. xsdParseDateTime(xsdGetPropChars(node, name, nameSpace), -1, Year, Month, Day, Hour, Minute, Second, Milliseconds, Timezone, BC);
  1097. end;
  1098. procedure xsdGetPropDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: TDateTime; Timezone: PXsdTimezone);
  1099. begin
  1100. xsdParseDateTime(xsdGetPropChars(node, name, nameSpace), -1, Value, Timezone);
  1101. end;
  1102. procedure xsdGetPropDecimal(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Extended);
  1103. begin
  1104. xsdParseDecimal(xsdGetPropChars(node, name, nameSpace), -1, Value);
  1105. end;
  1106. procedure xsdGetPropDouble(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Double);
  1107. begin
  1108. xsdParseDouble(xsdGetPropChars(node, name, nameSpace), -1, Value);
  1109. end;
  1110. procedure xsdGetPropFloat(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Single);
  1111. begin
  1112. xsdParseFloat(xsdGetPropChars(node, name, nameSpace), -1, Value);
  1113. end;
  1114. procedure xsdGetPropByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Shortint);
  1115. begin
  1116. xsdParseByte(xsdGetPropChars(node, name, nameSpace), -1, Value);
  1117. end;
  1118. procedure xsdGetPropShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Smallint);
  1119. begin
  1120. xsdParseShort(xsdGetPropChars(node, name, nameSpace), -1, Value);
  1121. end;
  1122. procedure xsdGetPropInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longint);
  1123. begin
  1124. xsdParseInt(xsdGetPropChars(node, name, nameSpace), -1, Value);
  1125. end;
  1126. procedure xsdGetPropLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Int64);
  1127. begin
  1128. xsdParseLong(xsdGetPropChars(node, name, nameSpace), -1, Value);
  1129. end;
  1130. procedure xsdGetPropUnsignedByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Byte);
  1131. begin
  1132. xsdParseUnsignedByte(xsdGetPropChars(node, name, nameSpace), -1, Value);
  1133. end;
  1134. procedure xsdGetPropUnsignedShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Word);
  1135. begin
  1136. xsdParseUnsignedShort(xsdGetPropChars(node, name, nameSpace), -1, Value);
  1137. end;
  1138. procedure xsdGetPropUnsignedInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: Longword);
  1139. begin
  1140. xsdParseUnsignedInt(xsdGetPropChars(node, name, nameSpace), -1, Value);
  1141. end;
  1142. procedure xsdGetPropUnsignedLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; out Value: QWord);
  1143. begin
  1144. xsdParseUnsignedLong(xsdGetPropChars(node, name, nameSpace), -1, Value);
  1145. end;
  1146. procedure xsdGetPropEnum(node: xmlNodePtr; name, nameSpace: xmlCharPtr; enum: array of AnsiString; out Value: Integer);
  1147. begin
  1148. xsdParseEnum(xsdGetPropChars(node, name, nameSpace), -1, enum, Value);
  1149. end;
  1150. function xsdRemoveBlanks(content: xmlCharPtr; out cleaned: AnsiString): boolean;
  1151. var
  1152. Space: Boolean;
  1153. len: Integer;
  1154. begin
  1155. cleaned := '';
  1156. if Assigned(content) then
  1157. begin
  1158. Space := True;
  1159. while content^ <> #0 do
  1160. begin
  1161. if xmlIsBlank(cuint(content^)) then
  1162. begin
  1163. if not Space then
  1164. cleaned := cleaned + ' ';
  1165. Space := True;
  1166. end else begin
  1167. cleaned := cleaned + content^;
  1168. Space := False;
  1169. end;
  1170. Inc(content);
  1171. end;
  1172. end;
  1173. len := Length(cleaned);
  1174. if len > 0 then
  1175. begin
  1176. if cleaned[len] = ' ' then
  1177. SetLength(cleaned, len-1);
  1178. Result := True;
  1179. end else
  1180. Result := False;
  1181. end;
  1182. end.