You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

915 lines
46 KiB

  1. unit uutlXmlHelper;
  2. {$mode objfpc}{$H+}
  3. { *************************** EXAMPLE *********************************
  4. doc := TXMLDocument.Create;
  5. try
  6. root := doc.CreateElement('root');
  7. doc.AppendChild(root);
  8. with TutlXmlHelper.Create(root) do begin
  9. SetAttribString('test', 'blubb');
  10. SetAttribInt('new', 123);
  11. with TutlXmlHelper.Create(AppendNode('test')) do begin
  12. SetString('child node :)');
  13. end;
  14. with TutlXmlHelper.Create(AppendNode('test')) do begin
  15. SetString('another child node :)');
  16. end;
  17. end;
  18. WriteXMLFile(doc, 'save.xml');
  19. finally
  20. FreeAndNil(doc);
  21. end; }
  22. interface
  23. uses
  24. Classes, SysUtils, DOM;
  25. type
  26. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  27. IutlNodeEnumerator = interface(specialize IEnumerator<TDOMElement>)
  28. ['{59F90C67-8A0B-48AC-8A49-D39317A07FE2}']
  29. function GetEnumerator: IutlNodeEnumerator;
  30. end;
  31. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  32. IutlXmlHelper = interface(IUnknown)
  33. ['{C489CEC8-BAD6-4E03-A554-9DF31E84CDBB}']
  34. // simple properties
  35. function GetElement: TDOMElement;
  36. property Element: TDOMElement read GetElement;
  37. // set value of current node
  38. procedure SetString (const aValue: String); overload;
  39. procedure SetString (const aValue: WideString); overload;
  40. procedure SetString (const aValue: UnicodeString); overload;
  41. procedure SetInt (const aValue: Integer);
  42. procedure SetFloat (const aValue: Double);
  43. procedure SetBool (const aValue: Boolean);
  44. // get value of current node
  45. function GetString (const aDefault: String = ''): String;
  46. function GetStringW (const aDefault: WideString = ''): WideString;
  47. function GetStringU (const aDefault: UnicodeString = ''): UnicodeString;
  48. function GetInt (const aDefault: Int64 = 0): Int64;
  49. function GetFloat (const aDefault: Double = 0): Double;
  50. function GetBool (const aDefault: Boolean = false): Boolean;
  51. // try get value of current node
  52. function TryGetString (out aValue: String): Boolean;
  53. function TryGetStringW (out aValue: WideString): Boolean;
  54. function TryGetStringU (out aValue: UnicodeString): Boolean;
  55. function TryGetInt (out aValue: Int64): Boolean;
  56. function TryGetFloat (out aValue: Double): Boolean;
  57. function TryGetBool (out aValue: Boolean): Boolean;
  58. // set value of attribute
  59. procedure SetAttribString (const aName: DOMString; const aValue: String); overload;
  60. procedure SetAttribString (const aName: DOMString; const aValue: WideString); overload;
  61. procedure SetAttribString (const aName: DOMString; const aValue: UnicodeString); overload;
  62. procedure SetAttribInt (const aName: DOMString; const aValue: Integer); overload;
  63. procedure SetAttribFloat (const aName: DOMString; const aValue: Double);
  64. procedure SetAttribBool (const aName: DOMString; const aValue: Boolean);
  65. // get value of attribute
  66. function GetAttribString (const aName: DOMString; const aDefault: String = ''): String;
  67. function GetAttribStringW (const aName: DOMString; const aDefault: WideString = ''): WideString;
  68. function GetAttribStringU (const aName: DOMString; const aDefault: UnicodeString = ''): UnicodeString;
  69. function GetAttribInt (const aName: DOMString; const aDefault: Int64 = 0): Int64;
  70. function GetAttribFloat (const aName: DOMString; const aDefault: Double = 0): Double;
  71. function GetAttribBool (const aName: DOMString; const aDefault: Boolean = false): Boolean;
  72. // get value of attribute
  73. function TryGetAttribString (const aName: DOMString; out aValue: String): Boolean;
  74. function TryGetAttribStringW (const aName: DOMString; out aValue: WideString): Boolean;
  75. function TryGetAttribStringU (const aName: DOMString; out aValue: UnicodeString): Boolean;
  76. function TryGetAttribInt (const aName: DOMString; out aValue: Int64): Boolean;
  77. function TryGetAttribFloat (const aName: DOMString; out aValue: Double): Boolean;
  78. function TryGetAttribBool (const aName: DOMString; out aValue: Boolean): Boolean;
  79. // node operations
  80. function Nodes (const aName: DOMString = ''): IutlNodeEnumerator;
  81. function Node (const aName: DOMString; const aCanCreate: Boolean = true): TDOMElement;
  82. function PrependNode (const aName: DOMString): TDOMElement;
  83. function AppendNode (const aName: DOMString): TDOMElement;
  84. procedure PrependText (const aText: DOMString);
  85. procedure AppendText (const aText: DOMString);
  86. end;
  87. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  88. TutlNodeEnumerator = class(TInterfacedObject, IutlNodeEnumerator)
  89. private
  90. fIndex: Integer;
  91. fName: DOMString;
  92. fParent: TDOMElement;
  93. public { INodeEnumerator }
  94. function GetEnumerator: IutlNodeEnumerator;
  95. function GetCurrent: TDOMElement;
  96. function MoveNext: Boolean;
  97. procedure Reset;
  98. public
  99. constructor Create(const aParent: TDOMElement; const aName: DOMString);
  100. end;
  101. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  102. TutlXmlHelper = class(TInterfacedObject, IutlXmlHelper)
  103. private
  104. fElement: TDOMElement;
  105. public { IutlXmlHelper }
  106. function GetElement: TDOMElement;
  107. // set value of current node
  108. procedure SetString (const aValue: String); overload;
  109. procedure SetString (const aValue: WideString); overload;
  110. procedure SetString (const aValue: UnicodeString); overload;
  111. procedure SetInt (const aValue: Integer);
  112. procedure SetFloat (const aValue: Double);
  113. procedure SetBool (const aValue: Boolean);
  114. // get value of current node
  115. function GetString (const aDefault: String): String;
  116. function GetStringW (const aDefault: WideString): WideString;
  117. function GetStringU (const aDefault: UnicodeString): UnicodeString;
  118. function GetInt (const aDefault: Int64): Int64;
  119. function GetFloat (const aDefault: Double): Double;
  120. function GetBool (const aDefault: Boolean): Boolean;
  121. // try get value of current node
  122. function TryGetString (out aValue: String): Boolean;
  123. function TryGetStringW (out aValue: WideString): Boolean;
  124. function TryGetStringU (out aValue: UnicodeString): Boolean;
  125. function TryGetInt (out aValue: Int64): Boolean;
  126. function TryGetFloat (out aValue: Double): Boolean;
  127. function TryGetBool (out aValue: Boolean): Boolean;
  128. // set value of attribute
  129. procedure SetAttribString (const aName: DOMString; const aValue: String); overload;
  130. procedure SetAttribString (const aName: DOMString; const aValue: WideString); overload;
  131. procedure SetAttribString (const aName: DOMString; const aValue: UnicodeString); overload;
  132. procedure SetAttribInt (const aName: DOMString; const aValue: Integer); overload;
  133. procedure SetAttribFloat (const aName: DOMString; const aValue: Double);
  134. procedure SetAttribBool (const aName: DOMString; const aValue: Boolean);
  135. // get value of attribute
  136. function GetAttribString (const aName: DOMString; const aDefault: String): String;
  137. function GetAttribStringW (const aName: DOMString; const aDefault: WideString): WideString;
  138. function GetAttribStringU (const aName: DOMString; const aDefault: UnicodeString): UnicodeString;
  139. function GetAttribInt (const aName: DOMString; const aDefault: Int64): Int64;
  140. function GetAttribFloat (const aName: DOMString; const aDefault: Double): Double;
  141. function GetAttribBool (const aName: DOMString; const aDefault: Boolean): Boolean;
  142. // get value of attribute
  143. function TryGetAttribString (const aName: DOMString; out aValue: String): Boolean;
  144. function TryGetAttribStringW(const aName: DOMString; out aValue: WideString): Boolean;
  145. function TryGetAttribStringU(const aName: DOMString; out aValue: UnicodeString): Boolean;
  146. function TryGetAttribInt (const aName: DOMString; out aValue: Int64): Boolean;
  147. function TryGetAttribFloat (const aName: DOMString; out aValue: Double): Boolean;
  148. function TryGetAttribBool (const aName: DOMString; out aValue: Boolean): Boolean;
  149. // node operations
  150. function Nodes (const aName: DOMString): IutlNodeEnumerator;
  151. function Node (const aName: DOMString; const aCanCreate: Boolean = true): TDOMElement;
  152. function PrependNode (const aName: DOMString): TDOMElement;
  153. function AppendNode (const aName: DOMString): TDOMElement;
  154. procedure PrependText (const aText: DOMString);
  155. procedure AppendText (const aText: DOMString);
  156. private
  157. {%H-}constructor Create; reintroduce;
  158. {%H-}constructor Create(const aElement: TDOMElement); reintroduce;
  159. public
  160. class function Create(const aElement: TDOMElement): IutlXmlHelper;
  161. public
  162. // set value of current node
  163. class function SetString (const aNode: TDOMNode; const aValue: String): TDOMNode; overload;
  164. class function SetString (const aNode: TDOMNode; const aValue: WideString): TDOMNode; overload;
  165. class function SetString (const aNode: TDOMNode; const aValue: UnicodeString): TDOMNode; overload;
  166. class function SetInt (const aNode: TDOMNode; const aValue: Integer): TDOMNode; overload;
  167. class function SetFloat (const aNode: TDOMNode; const aValue: Double): TDOMNode;
  168. class function SetBool (const aNode: TDOMNode; const aValue: Boolean): TDOMNode;
  169. // get value of current node
  170. class function GetString (const aNode: TDOMNode; const aDefault: String): String;
  171. class function GetStringW (const aNode: TDOMNode; const aDefault: WideString): WideString;
  172. class function GetStringU (const aNode: TDOMNode; const aDefault: UnicodeString): UnicodeString;
  173. class function GetInt (const aNode: TDOMNode; const aDefault: Int64): Int64;
  174. class function GetFloat (const aNode: TDOMNode; const aDefault: Double): Double;
  175. class function GetBool (const aNode: TDOMNode; const aDefault: Boolean): Boolean;
  176. // try get value of current node
  177. class function TryGetString (const aNode: TDOMNode; out aValue: String): Boolean;
  178. class function TryGetStringW (const aNode: TDOMNode; out aValue: WideString): Boolean;
  179. class function TryGetStringU (const aNode: TDOMNode; out aValue: UnicodeString): Boolean;
  180. class function TryGetInt (const aNode: TDOMNode; out aValue: Int64): Boolean;
  181. class function TryGetFloat (const aNode: TDOMNode; out aValue: Double): Boolean;
  182. class function TryGetBool (const aNode: TDOMNode; out aValue: Boolean): Boolean;
  183. // set value of attribute
  184. class procedure SetAttribString (const aNode: TDOMElement; const aName: DOMString; const aValue: String); overload;
  185. class procedure SetAttribString (const aNode: TDOMElement; const aName: DOMString; const aValue: WideString); overload;
  186. class procedure SetAttribString (const aNode: TDOMElement; const aName: DOMString; const aValue: UnicodeString); overload;
  187. class procedure SetAttribInt (const aNode: TDOMElement; const aName: DOMString; const aValue: Integer); overload;
  188. class procedure SetAttribFloat (const aNode: TDOMElement; const aName: DOMString; const aValue: Double);
  189. class procedure SetAttribBool (const aNode: TDOMElement; const aName: DOMString; const aValue: Boolean);
  190. // get value of attribute
  191. class function GetAttribString (const aNode: TDOMElement; const aName: DOMString; const aDefault: String = ''): String;
  192. class function GetAttribStringW (const aNode: TDOMElement; const aName: DOMString; const aDefault: WideString = ''): WideString;
  193. class function GetAttribStringU (const aNode: TDOMElement; const aName: DOMString; const aDefault: UnicodeString = ''): UnicodeString;
  194. class function GetAttribInt (const aNode: TDOMElement; const aName: DOMString; const aDefault: Int64 = 0): Int64;
  195. class function GetAttribFloat (const aNode: TDOMElement; const aName: DOMString; const aDefault: Double = 0): Double;
  196. class function GetAttribBool (const aNode: TDOMElement; const aName: DOMString; const aDefault: Boolean = false): Boolean;
  197. // get value of attribute
  198. class function TryGetAttribString (const aNode: TDOMElement; const aName: DOMString; out aValue: String): Boolean;
  199. class function TryGetAttribStringW (const aNode: TDOMElement; const aName: DOMString; out aValue: WideString): Boolean;
  200. class function TryGetAttribStringU (const aNode: TDOMElement; const aName: DOMString; out aValue: UnicodeString): Boolean;
  201. class function TryGetAttribInt (const aNode: TDOMElement; const aName: DOMString; out aValue: Int64): Boolean;
  202. class function TryGetAttribFloat (const aNode: TDOMElement; const aName: DOMString; out aValue: Double): Boolean;
  203. class function TryGetAttribBool (const aNode: TDOMElement; const aName: DOMString; out aValue: Boolean): Boolean;
  204. // node operations
  205. class function Nodes (const aElement: TDOMElement; const aName: DOMString = ''): IutlNodeEnumerator;
  206. class function Node (const aElement: TDOMElement; const aName: DOMString; const aCanCreate: Boolean = true): TDOMElement;
  207. class function PrependNode (const aElement: TDOMElement; const aName: DOMString): TDOMElement;
  208. class function AppendNode (const aElement: TDOMElement; const aName: DOMString): TDOMElement;
  209. class procedure PrependText (const aElement: TDOMElement; const aText: DOMString);
  210. class procedure AppendText (const aElement: TDOMElement; const aText: DOMString);
  211. end;
  212. implementation
  213. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  214. //TutlNodeEnumerator/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  215. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  216. function TutlNodeEnumerator.GetEnumerator: IutlNodeEnumerator;
  217. begin
  218. result := self;
  219. end;
  220. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  221. function TutlNodeEnumerator.GetCurrent: TDOMElement;
  222. begin
  223. result := (fParent.ChildNodes[fIndex] as TDOMElement);
  224. end;
  225. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  226. function TutlNodeEnumerator.MoveNext: Boolean;
  227. var
  228. c: Integer;
  229. begin
  230. c := fParent.ChildNodes.Count;
  231. repeat
  232. inc(fIndex)
  233. until (fIndex >= c)
  234. or ( (fParent.ChildNodes[fIndex] is TDOMElement)
  235. and ( (fName = '')
  236. or (fName = fParent.ChildNodes[fIndex].NodeName)));
  237. result := (fIndex < c);
  238. end;
  239. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  240. procedure TutlNodeEnumerator.Reset;
  241. begin
  242. fIndex := -1;
  243. end;
  244. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  245. constructor TutlNodeEnumerator.Create(const aParent: TDOMElement; const aName: DOMString);
  246. begin
  247. inherited Create;
  248. fParent := aParent;
  249. fName := aName;
  250. fIndex := -1;
  251. end;
  252. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  253. //TutlXmlHelper//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  254. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  255. function TutlXmlHelper.GetElement: TDOMElement;
  256. begin
  257. result := fElement;
  258. end;
  259. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  260. procedure TutlXmlHelper.SetString(const aValue: String);
  261. begin
  262. TutlXmlHelper.SetString(fElement, aValue);
  263. end;
  264. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  265. procedure TutlXmlHelper.SetString(const aValue: WideString);
  266. begin
  267. TutlXmlHelper.SetString(fElement, aValue);
  268. end;
  269. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  270. procedure TutlXmlHelper.SetString(const aValue: UnicodeString);
  271. begin
  272. TutlXmlHelper.SetString(fElement, aValue);
  273. end;
  274. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  275. procedure TutlXmlHelper.SetInt(const aValue: Integer);
  276. begin
  277. TutlXmlHelper.SetInt(fElement, aValue);
  278. end;
  279. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  280. procedure TutlXmlHelper.SetFloat(const aValue: Double);
  281. begin
  282. TutlXmlHelper.SetFloat(fElement, aValue);
  283. end;
  284. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  285. procedure TutlXmlHelper.SetBool(const aValue: Boolean);
  286. begin
  287. TutlXmlHelper.SetBool(fElement, aValue);
  288. end;
  289. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  290. function TutlXmlHelper.GetString(const aDefault: String): String;
  291. begin
  292. result := TutlXmlHelper.GetString(fElement, aDefault);
  293. end;
  294. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  295. function TutlXmlHelper.GetStringW(const aDefault: WideString): WideString;
  296. begin
  297. result := TutlXmlHelper.GetStringW(fElement, aDefault);
  298. end;
  299. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  300. function TutlXmlHelper.GetStringU(const aDefault: UnicodeString): UnicodeString;
  301. begin
  302. result := TutlXmlHelper.GetStringU(fElement, aDefault);
  303. end;
  304. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  305. function TutlXmlHelper.GetInt(const aDefault: Int64): Int64;
  306. begin
  307. result := TutlXmlHelper.GetInt(fElement, aDefault);
  308. end;
  309. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  310. function TutlXmlHelper.GetFloat(const aDefault: Double): Double;
  311. begin
  312. result := TutlXmlHelper.GetFloat(fElement, aDefault);
  313. end;
  314. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  315. function TutlXmlHelper.GetBool(const aDefault: Boolean): Boolean;
  316. begin
  317. result := TutlXmlHelper.GetBool(fElement, aDefault);
  318. end;
  319. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  320. function TutlXmlHelper.TryGetString(out aValue: String): Boolean;
  321. begin
  322. result := TutlXmlHelper.TryGetString(fElement, aValue);
  323. end;
  324. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  325. function TutlXmlHelper.TryGetStringW(out aValue: WideString): Boolean;
  326. begin
  327. result := TutlXmlHelper.TryGetStringW(fElement, aValue);
  328. end;
  329. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  330. function TutlXmlHelper.TryGetStringU(out aValue: UnicodeString): Boolean;
  331. begin
  332. result := TutlXmlHelper.TryGetStringU(fElement, aValue);
  333. end;
  334. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  335. function TutlXmlHelper.TryGetInt(out aValue: Int64): Boolean;
  336. begin
  337. result := TutlXmlHelper.TryGetInt(fElement, aValue);
  338. end;
  339. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  340. function TutlXmlHelper.TryGetFloat(out aValue: Double): Boolean;
  341. begin
  342. result := TutlXmlHelper.TryGetFloat(fElement, aValue);
  343. end;
  344. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  345. function TutlXmlHelper.TryGetBool(out aValue: Boolean): Boolean;
  346. begin
  347. result := TutlXmlHelper.TryGetBool(fElement, aValue);
  348. end;
  349. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  350. procedure TutlXmlHelper.SetAttribString(const aName: DOMString; const aValue: String);
  351. begin
  352. TutlXmlHelper.SetAttribString(fElement, aName, aValue);
  353. end;
  354. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  355. procedure TutlXmlHelper.SetAttribString(const aName: DOMString; const aValue: WideString);
  356. begin
  357. TutlXmlHelper.SetAttribString(fElement, aName, aValue);
  358. end;
  359. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  360. procedure TutlXmlHelper.SetAttribString(const aName: DOMString; const aValue: UnicodeString);
  361. begin
  362. TutlXmlHelper.SetAttribString(fElement, aName, aValue);
  363. end;
  364. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  365. procedure TutlXmlHelper.SetAttribInt(const aName: DOMString; const aValue: Integer);
  366. begin
  367. TutlXmlHelper.SetAttribInt(fElement, aName, aValue);
  368. end;
  369. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  370. procedure TutlXmlHelper.SetAttribFloat(const aName: DOMString; const aValue: Double);
  371. begin
  372. TutlXmlHelper.SetAttribFloat(fElement, aName, aValue);
  373. end;
  374. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  375. procedure TutlXmlHelper.SetAttribBool(const aName: DOMString; const aValue: Boolean);
  376. begin
  377. TutlXmlHelper.SetAttribBool(fElement, aName, aValue);
  378. end;
  379. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  380. function TutlXmlHelper.GetAttribString(const aName: DOMString; const aDefault: String): String;
  381. begin
  382. result := TutlXmlHelper.GetAttribString(fElement, aName, aDefault);
  383. end;
  384. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  385. function TutlXmlHelper.GetAttribStringW(const aName: DOMString; const aDefault: WideString): WideString;
  386. begin
  387. result := TutlXmlHelper.GetAttribStringW(fElement, aName, aDefault);
  388. end;
  389. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  390. function TutlXmlHelper.GetAttribStringU(const aName: DOMString; const aDefault: UnicodeString): UnicodeString;
  391. begin
  392. result := TutlXmlHelper.GetAttribStringU(fElement, aName, aDefault);
  393. end;
  394. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  395. function TutlXmlHelper.GetAttribInt(const aName: DOMString; const aDefault: Int64): Int64;
  396. begin
  397. result := TutlXmlHelper.GetAttribInt(fElement, aName, aDefault);
  398. end;
  399. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  400. function TutlXmlHelper.GetAttribFloat(const aName: DOMString; const aDefault: Double): Double;
  401. begin
  402. result := TutlXmlHelper.GetAttribFloat(fElement, aName, aDefault);
  403. end;
  404. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  405. function TutlXmlHelper.GetAttribBool(const aName: DOMString; const aDefault: Boolean): Boolean;
  406. begin
  407. result := TutlXmlHelper.GetAttribBool(fElement, aName, aDefault);
  408. end;
  409. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  410. function TutlXmlHelper.TryGetAttribString(const aName: DOMString; out aValue: String): Boolean;
  411. begin
  412. result := TutlXmlHelper.TryGetAttribString(fElement, aName, aValue);
  413. end;
  414. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  415. function TutlXmlHelper.TryGetAttribStringW(const aName: DOMString; out aValue: WideString): Boolean;
  416. begin
  417. result := TutlXmlHelper.TryGetAttribStringW(fElement, aName, aValue);
  418. end;
  419. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  420. function TutlXmlHelper.TryGetAttribStringU(const aName: DOMString; out aValue: UnicodeString): Boolean;
  421. begin
  422. result := TutlXmlHelper.TryGetAttribStringU(fElement, aName, aValue);
  423. end;
  424. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  425. function TutlXmlHelper.TryGetAttribInt(const aName: DOMString; out aValue: Int64): Boolean;
  426. begin
  427. result := TutlXmlHelper.TryGetAttribInt(fElement, aName, aValue);
  428. end;
  429. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  430. function TutlXmlHelper.TryGetAttribFloat(const aName: DOMString; out aValue: Double): Boolean;
  431. begin
  432. result := TutlXmlHelper.TryGetAttribFloat(fElement, aName, aValue);
  433. end;
  434. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  435. function TutlXmlHelper.TryGetAttribBool(const aName: DOMString; out aValue: Boolean): Boolean;
  436. begin
  437. result := TutlXmlHelper.TryGetAttribBool(fElement, aName, aValue);
  438. end;
  439. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  440. function TutlXmlHelper.Nodes(const aName: DOMString): IutlNodeEnumerator;
  441. begin
  442. result := TutlXmlHelper.Nodes(fElement, aName);
  443. end;
  444. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  445. function TutlXmlHelper.Node(const aName: DOMString; const aCanCreate: Boolean): TDOMElement;
  446. begin
  447. result := TutlXmlHelper.Node(fElement, aName, aCanCreate);
  448. end;
  449. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  450. function TutlXmlHelper.PrependNode(const aName: DOMString): TDOMElement;
  451. begin
  452. result := TutlXmlHelper.PrependNode(fElement, aName);
  453. end;
  454. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  455. function TutlXmlHelper.AppendNode(const aName: DOMString): TDOMElement;
  456. begin
  457. result := TutlXmlHelper.AppendNode(fElement, aName);
  458. end;
  459. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  460. procedure TutlXmlHelper.PrependText(const aText: DOMString);
  461. begin
  462. TutlXmlHelper.PrependText(fElement, aText);
  463. end;
  464. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  465. procedure TutlXmlHelper.AppendText(const aText: DOMString);
  466. begin
  467. TutlXmlHelper.AppendText(fElement, aText);
  468. end;
  469. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  470. constructor TutlXmlHelper.Create;
  471. begin
  472. inherited Create;
  473. fElement := nil;
  474. end;
  475. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  476. constructor TutlXmlHelper.Create(const aElement: TDOMElement);
  477. begin
  478. Create;
  479. fElement := aElement;
  480. end;
  481. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  482. class function TutlXmlHelper.Create(const aElement: TDOMElement): IutlXmlHelper;
  483. begin
  484. result := TutlXmlHelper.Create(aElement);
  485. end;
  486. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  487. class function TutlXmlHelper.SetString(const aNode: TDOMNode; const aValue: String): TDOMNode;
  488. begin
  489. result := aNode;
  490. if Assigned(aNode) then
  491. aNode.TextContent := DOMString(aValue);
  492. end;
  493. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  494. class function TutlXmlHelper.SetString(const aNode: TDOMNode; const aValue: WideString): TDOMNode;
  495. begin
  496. result := aNode;
  497. if Assigned(aNode) then
  498. aNode.TextContent := DOMString(aValue);
  499. end;
  500. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  501. class function TutlXmlHelper.SetString(const aNode: TDOMNode; const aValue: UnicodeString): TDOMNode;
  502. begin
  503. result := aNode;
  504. if Assigned(aNode) then
  505. aNode.TextContent := DOMString(aValue);
  506. end;
  507. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  508. class function TutlXmlHelper.SetInt(const aNode: TDOMNode; const aValue: Integer): TDOMNode;
  509. begin
  510. result := aNode;
  511. if Assigned(aNode) then
  512. aNode.TextContent := DOMString(IntToStr(aValue));
  513. end;
  514. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  515. class function TutlXmlHelper.SetFloat(const aNode: TDOMNode; const aValue: Double): TDOMNode;
  516. begin
  517. result := aNode;
  518. if Assigned(aNode) then
  519. aNode.TextContent := DOMString(FloatToStr(aValue));
  520. end;
  521. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  522. class function TutlXmlHelper.SetBool(const aNode: TDOMNode; const aValue: Boolean): TDOMNode;
  523. begin
  524. result := aNode;
  525. if Assigned(aNode) then begin
  526. if aValue
  527. then aNode.TextContent := 'true'
  528. else aNode.TextContent := 'false';
  529. end;
  530. end;
  531. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  532. class function TutlXmlHelper.GetString(const aNode: TDOMNode; const aDefault: String): String;
  533. begin
  534. if not TryGetString(aNode, result) then
  535. result := aDefault;
  536. end;
  537. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  538. class function TutlXmlHelper.GetStringW(const aNode: TDOMNode; const aDefault: WideString): WideString;
  539. begin
  540. if not TryGetStringW(aNode, result) then
  541. result := aDefault;
  542. end;
  543. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  544. class function TutlXmlHelper.GetStringU(const aNode: TDOMNode; const aDefault: UnicodeString): UnicodeString;
  545. begin
  546. if not TryGetStringU(aNode, result) then
  547. result := aDefault;
  548. end;
  549. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  550. class function TutlXmlHelper.GetInt(const aNode: TDOMNode; const aDefault: Int64): Int64;
  551. begin
  552. if not TryGetInt(aNode, result) then
  553. result := aDefault;
  554. end;
  555. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  556. class function TutlXmlHelper.GetFloat(const aNode: TDOMNode; const aDefault: Double): Double;
  557. begin
  558. if not TryGetFloat(aNode, result) then
  559. result := aDefault;
  560. end;
  561. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  562. class function TutlXmlHelper.GetBool(const aNode: TDOMNode; const aDefault: Boolean): Boolean;
  563. begin
  564. if not TryGetBool(aNode, result) then
  565. result := aDefault;
  566. end;
  567. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  568. class function TutlXmlHelper.TryGetString(const aNode: TDOMNode; out aValue: String): Boolean;
  569. begin
  570. result := Assigned(aNode)
  571. and ( aNode.HasChildNodes
  572. or (aNode is TDOMText));
  573. if result then
  574. aValue := String(aNode.TextContent);
  575. end;
  576. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  577. class function TutlXmlHelper.TryGetStringW(const aNode: TDOMNode; out aValue: WideString): Boolean;
  578. begin
  579. result := Assigned(aNode)
  580. and ( aNode.HasChildNodes
  581. or (aNode is TDOMText));
  582. if result then
  583. aValue := WideString(aNode.TextContent);
  584. end;
  585. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  586. class function TutlXmlHelper.TryGetStringU(const aNode: TDOMNode; out aValue: UnicodeString): Boolean;
  587. begin
  588. result := Assigned(aNode)
  589. and ( aNode.HasChildNodes
  590. or (aNode is TDOMText));
  591. if result then
  592. aValue := UnicodeString(aNode.TextContent);
  593. end;
  594. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  595. class function TutlXmlHelper.TryGetInt(const aNode: TDOMNode; out aValue: Int64): Boolean;
  596. begin
  597. result := Assigned(aNode)
  598. and ( aNode.HasChildNodes
  599. or (aNode is TDOMText))
  600. and TryStrToInt64(String(aNode.TextContent), aValue);
  601. end;
  602. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  603. class function TutlXmlHelper.TryGetFloat(const aNode: TDOMNode; out aValue: Double): Boolean;
  604. begin
  605. result := Assigned(aNode)
  606. and ( aNode.HasChildNodes
  607. or (aNode is TDOMText))
  608. and TryStrToFloat(String(aNode.TextContent), aValue);
  609. end;
  610. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  611. class function TutlXmlHelper.TryGetBool(const aNode: TDOMNode; out aValue: Boolean): Boolean;
  612. var
  613. s: String;
  614. begin
  615. result := TryGetString(aNode, s);
  616. if result then begin
  617. if (s = 'true') or (s = 't') or (s = '1')
  618. then aValue := true
  619. else aValue := false;
  620. end;
  621. end;
  622. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  623. class procedure TutlXmlHelper.SetAttribString(const aNode: TDOMElement; const aName: DOMString; const aValue: String);
  624. begin
  625. aNode.SetAttributeNode(TutlXmlHelper.SetString(aNode.OwnerDocument.CreateAttribute(aName), aValue) as TDOMAttr);
  626. end;
  627. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  628. class procedure TutlXmlHelper.SetAttribString(const aNode: TDOMElement; const aName: DOMString; const aValue: WideString);
  629. begin
  630. aNode.SetAttributeNode(TutlXmlHelper.SetString(aNode.OwnerDocument.CreateAttribute(aName), aValue) as TDOMAttr);
  631. end;
  632. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  633. class procedure TutlXmlHelper.SetAttribString(const aNode: TDOMElement; const aName: DOMString; const aValue: UnicodeString);
  634. begin
  635. aNode.SetAttributeNode(TutlXmlHelper.SetString(aNode.OwnerDocument.CreateAttribute(aName), aValue) as TDOMAttr);
  636. end;
  637. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  638. class procedure TutlXmlHelper.SetAttribInt(const aNode: TDOMElement; const aName: DOMString; const aValue: Integer);
  639. begin
  640. aNode.SetAttributeNode(TutlXmlHelper.SetInt(aNode.OwnerDocument.CreateAttribute(aName), aValue) as TDOMAttr);
  641. end;
  642. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  643. class procedure TutlXmlHelper.SetAttribFloat(const aNode: TDOMElement; const aName: DOMString; const aValue: Double);
  644. begin
  645. aNode.SetAttributeNode(TutlXmlHelper.SetFloat(aNode.OwnerDocument.CreateAttribute(aName), aValue) as TDOMAttr);
  646. end;
  647. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  648. class procedure TutlXmlHelper.SetAttribBool(const aNode: TDOMElement; const aName: DOMString; const aValue: Boolean);
  649. begin
  650. aNode.SetAttributeNode(TutlXmlHelper.SetBool(aNode.OwnerDocument.CreateAttribute(aName), aValue) as TDOMAttr);
  651. end;
  652. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  653. class function TutlXmlHelper.GetAttribString(const aNode: TDOMElement; const aName: DOMString; const aDefault: String): String;
  654. begin
  655. result := TutlXmlHelper.GetString(aNode.Attributes.GetNamedItem(aName), aDefault);
  656. end;
  657. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  658. class function TutlXmlHelper.GetAttribStringW(const aNode: TDOMElement; const aName: DOMString; const aDefault: WideString): WideString;
  659. begin
  660. result := TutlXmlHelper.GetStringW(aNode.Attributes.GetNamedItem(aName), aDefault);
  661. end;
  662. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  663. class function TutlXmlHelper.GetAttribStringU(const aNode: TDOMElement; const aName: DOMString; const aDefault: UnicodeString): UnicodeString;
  664. begin
  665. result := TutlXmlHelper.GetStringU(aNode.Attributes.GetNamedItem(aName), aDefault);
  666. end;
  667. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  668. class function TutlXmlHelper.GetAttribInt(const aNode: TDOMElement; const aName: DOMString; const aDefault: Int64): Int64;
  669. begin
  670. result := TutlXmlHelper.GetInt(aNode.Attributes.GetNamedItem(aName), aDefault);
  671. end;
  672. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  673. class function TutlXmlHelper.GetAttribFloat(const aNode: TDOMElement; const aName: DOMString; const aDefault: Double): Double;
  674. begin
  675. result := TutlXmlHelper.GetFloat(aNode.Attributes.GetNamedItem(aName), aDefault);
  676. end;
  677. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  678. class function TutlXmlHelper.GetAttribBool(const aNode: TDOMElement; const aName: DOMString; const aDefault: Boolean): Boolean;
  679. begin
  680. result := TutlXmlHelper.GetBool(aNode.Attributes.GetNamedItem(aName), aDefault);
  681. end;
  682. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  683. class function TutlXmlHelper.TryGetAttribString(const aNode: TDOMElement; const aName: DOMString; out aValue: String): Boolean;
  684. begin
  685. result := TutlXmlHelper.TryGetString(aNode.Attributes.GetNamedItem(aName), aValue);
  686. end;
  687. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  688. class function TutlXmlHelper.TryGetAttribStringW(const aNode: TDOMElement; const aName: DOMString; out aValue: WideString): Boolean;
  689. begin
  690. result := TutlXmlHelper.TryGetStringW(aNode.Attributes.GetNamedItem(aName), aValue);
  691. end;
  692. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  693. class function TutlXmlHelper.TryGetAttribStringU(const aNode: TDOMElement; const aName: DOMString; out aValue: UnicodeString): Boolean;
  694. begin
  695. result := TutlXmlHelper.TryGetStringU(aNode.Attributes.GetNamedItem(aName), aValue);
  696. end;
  697. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  698. class function TutlXmlHelper.TryGetAttribInt(const aNode: TDOMElement; const aName: DOMString; out aValue: Int64): Boolean;
  699. begin
  700. result := TutlXmlHelper.TryGetInt(aNode.Attributes.GetNamedItem(aName), aValue);
  701. end;
  702. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  703. class function TutlXmlHelper.TryGetAttribFloat(const aNode: TDOMElement; const aName: DOMString; out aValue: Double): Boolean;
  704. begin
  705. result := TutlXmlHelper.TryGetFloat(aNode.Attributes.GetNamedItem(aName), aValue);
  706. end;
  707. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  708. class function TutlXmlHelper.TryGetAttribBool(const aNode: TDOMElement; const aName: DOMString; out aValue: Boolean): Boolean;
  709. begin
  710. result := TutlXmlHelper.TryGetBool(aNode.Attributes.GetNamedItem(aName), aValue);
  711. end;
  712. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  713. class function TutlXmlHelper.Nodes(const aElement: TDOMElement; const aName: DOMString): IutlNodeEnumerator;
  714. begin
  715. result := TutlNodeEnumerator.Create(aElement, aName);
  716. end;
  717. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  718. class function TutlXmlHelper.Node(const aElement: TDOMElement; const aName: DOMString; const aCanCreate: Boolean): TDOMElement;
  719. var
  720. sl: TStringList;
  721. s: String;
  722. b: Boolean;
  723. i, c: Integer;
  724. begin
  725. sl := TStringList.Create;
  726. try
  727. sl.Delimiter := '.';
  728. sl.DelimitedText := String(aName);
  729. result := aElement;
  730. for s in sl do begin
  731. if (s = '') then
  732. continue;
  733. if not Assigned(result) then
  734. exit;
  735. b := false;
  736. c := result.ChildNodes.Count;
  737. for i := 0 to c-1 do begin
  738. if (result.ChildNodes[i].NodeName = DOMString(s)) then begin
  739. result := TDOMElement(result.ChildNodes[i]);
  740. b := true;
  741. break;
  742. end;
  743. end;
  744. if not b then begin
  745. if aCanCreate
  746. then result := AppendNode(result, DOMString(s))
  747. else result := nil;
  748. end;
  749. end;
  750. finally
  751. FreeAndNil(sl);
  752. end;
  753. end;
  754. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  755. class function TutlXmlHelper.PrependNode(const aElement: TDOMElement; const aName: DOMString): TDOMElement;
  756. begin
  757. result := aElement.OwnerDocument.CreateElement(aName);
  758. if aElement.HasChildNodes
  759. then aElement.InsertBefore(result, aElement.FirstChild)
  760. else aElement.AppendChild(result);
  761. end;
  762. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  763. class function TutlXmlHelper.AppendNode(const aElement: TDOMElement; const aName: DOMString): TDOMElement;
  764. begin
  765. result := aElement.OwnerDocument.CreateElement(aName);
  766. aElement.AppendChild(result);
  767. end;
  768. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  769. class procedure TutlXmlHelper.PrependText(const aElement: TDOMElement; const aText: DOMString);
  770. var n: TDOMNode;
  771. begin
  772. n := aElement.OwnerDocument.CreateTextNode(aText);
  773. if aElement.HasChildNodes
  774. then aElement.InsertBefore(n, aElement.FirstChild)
  775. else aElement.AppendChild(n);
  776. end;
  777. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  778. class procedure TutlXmlHelper.AppendText(const aElement: TDOMElement; const aText: DOMString);
  779. begin
  780. aElement.AppendChild(aElement.OwnerDocument.CreateTextNode(aText));
  781. end;
  782. end.