No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 

692 líneas
33 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 Node: 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): Int64;
  49. function GetFloat (const aDefault: Double): Double;
  50. function GetBool (const aDefault: Boolean): Boolean;
  51. // set value of attribute
  52. procedure SetAttribString (const aName: DOMString; const aValue: String); overload;
  53. procedure SetAttribString (const aName: DOMString; const aValue: WideString); overload;
  54. procedure SetAttribString (const aName: DOMString; const aValue: UnicodeString); overload;
  55. procedure SetAttribInt (const aName: DOMString; const aValue: Integer);
  56. procedure SetAttribFloat (const aName: DOMString; const aValue: Double);
  57. procedure SetAttribBool (const aName: DOMString; const aValue: Boolean);
  58. // get value of attribute
  59. function GetAttribString (const aName: DOMString; const aDefault: String): String;
  60. function GetAttribStringW (const aName: DOMString; const aDefault: WideString): WideString;
  61. function GetAttribStringU (const aName: DOMString; const aDefault: UnicodeString): UnicodeString;
  62. function GetAttribInt (const aName: DOMString; const aDefault: Int64): Int64;
  63. function GetAttribFloat (const aName: DOMString; const aDefault: Double): Double;
  64. function GetAttribBool (const aName: DOMString; const aDefault: Boolean): Boolean;
  65. // get value of attribute
  66. function TryGetAttribString (const aName: DOMString; out aValue: String): Boolean;
  67. function TryGetAttribStringW (const aName: DOMString; out aValue: WideString): Boolean;
  68. function TryGetAttribStringU (const aName: DOMString; out aValue: UnicodeString): Boolean;
  69. function TryGetAttribInt (const aName: DOMString; out aValue: Int64): Boolean;
  70. function TryGetAttribFloat (const aName: DOMString; out aValue: Double): Boolean;
  71. function TryGetAttribBool (const aName: DOMString; out aValue: Boolean): Boolean;
  72. // node operations
  73. function Nodes (const aName: DOMString): IutlNodeEnumerator;
  74. function PrependNode (const aName: DOMString): TDOMElement;
  75. function AppendNode (const aName: DOMString): TDOMElement;
  76. procedure PrependText (const aText: DOMString);
  77. procedure AppendText (const aText: DOMString);
  78. end;
  79. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  80. TutlNodeEnumerator = class(TInterfacedObject, IutlNodeEnumerator)
  81. private
  82. fIndex: Integer;
  83. fName: DOMString;
  84. fParent: TDOMElement;
  85. public { INodeEnumerator }
  86. function GetEnumerator: IutlNodeEnumerator;
  87. function GetCurrent: TDOMElement;
  88. function MoveNext: Boolean;
  89. procedure Reset;
  90. public
  91. constructor Create(const aParent: TDOMElement; const aName: DOMString);
  92. end;
  93. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  94. TutlXmlHelper = class(TInterfacedObject, IutlXmlHelper)
  95. private
  96. fElement: TDOMElement;
  97. public { IutlXmlHelper }
  98. function GetElement: TDOMElement;
  99. // set value of current node
  100. procedure SetString (const aValue: String); overload;
  101. procedure SetString (const aValue: WideString); overload;
  102. procedure SetString (const aValue: UnicodeString); overload;
  103. procedure SetInt (const aValue: Integer);
  104. procedure SetFloat (const aValue: Double);
  105. procedure SetBool (const aValue: Boolean);
  106. // get value of current node
  107. function GetString (const aDefault: String): String;
  108. function GetStringW (const aDefault: WideString): WideString;
  109. function GetStringU (const aDefault: UnicodeString): UnicodeString;
  110. function GetInt (const aDefault: Int64): Int64;
  111. function GetFloat (const aDefault: Double): Double;
  112. function GetBool (const aDefault: Boolean): Boolean;
  113. // set value of attribute
  114. procedure SetAttribString (const aName: DOMString; const aValue: String); overload;
  115. procedure SetAttribString (const aName: DOMString; const aValue: WideString); overload;
  116. procedure SetAttribString (const aName: DOMString; const aValue: UnicodeString); overload;
  117. procedure SetAttribInt (const aName: DOMString; const aValue: Integer);
  118. procedure SetAttribFloat (const aName: DOMString; const aValue: Double);
  119. procedure SetAttribBool (const aName: DOMString; const aValue: Boolean);
  120. // get value of attribute
  121. function GetAttribString (const aName: DOMString; const aDefault: String): String;
  122. function GetAttribStringW (const aName: DOMString; const aDefault: WideString): WideString;
  123. function GetAttribStringU (const aName: DOMString; const aDefault: UnicodeString): UnicodeString;
  124. function GetAttribInt (const aName: DOMString; const aDefault: Int64): Int64;
  125. function GetAttribFloat (const aName: DOMString; const aDefault: Double): Double;
  126. function GetAttribBool (const aName: DOMString; const aDefault: Boolean): Boolean;
  127. // get value of attribute
  128. function TryGetAttribString (const aName: DOMString; out aValue: String): Boolean;
  129. function TryGetAttribStringW(const aName: DOMString; out aValue: WideString): Boolean;
  130. function TryGetAttribStringU(const aName: DOMString; out aValue: UnicodeString): Boolean;
  131. function TryGetAttribInt (const aName: DOMString; out aValue: Int64): Boolean;
  132. function TryGetAttribFloat (const aName: DOMString; out aValue: Double): Boolean;
  133. function TryGetAttribBool (const aName: DOMString; out aValue: Boolean): Boolean;
  134. // node operations
  135. function Nodes (const aName: DOMString): IutlNodeEnumerator;
  136. function PrependNode (const aName: DOMString): TDOMElement;
  137. function AppendNode (const aName: DOMString): TDOMElement;
  138. procedure PrependText (const aText: DOMString);
  139. procedure AppendText (const aText: DOMString);
  140. private
  141. {%H-}constructor Create; reintroduce;
  142. {%H-}constructor Create(const aElement: TDOMElement); reintroduce;
  143. public
  144. class function Create(const aElement: TDOMElement): IutlXmlHelper;
  145. public
  146. class function SetString (const aNode: TDOMNode; const aValue: String): TDOMNode; overload;
  147. class function SetString (const aNode: TDOMNode; const aValue: WideString): TDOMNode; overload;
  148. class function SetString (const aNode: TDOMNode; const aValue: UnicodeString): TDOMNode; overload;
  149. class function SetInt (const aNode: TDOMNode; const aValue: Integer): TDOMNode;
  150. class function SetFloat (const aNode: TDOMNode; const aValue: Double): TDOMNode;
  151. class function SetBool (const aNode: TDOMNode; const aValue: Boolean): TDOMNode;
  152. class function GetString (const aNode: TDOMNode; const aDefault: String): String;
  153. class function GetStringW (const aNode: TDOMNode; const aDefault: WideString): WideString;
  154. class function GetStringU (const aNode: TDOMNode; const aDefault: UnicodeString): UnicodeString;
  155. class function GetInt (const aNode: TDOMNode; const aDefault: Int64): Int64;
  156. class function GetFloat (const aNode: TDOMNode; const aDefault: Double): Double;
  157. class function GetBool (const aNode: TDOMNode; const aDefault: Boolean): Boolean;
  158. class function TryGetString (const aNode: TDOMNode; out aValue: String): Boolean;
  159. class function TryGetStringW(const aNode: TDOMNode; out aValue: WideString): Boolean;
  160. class function TryGetStringU(const aNode: TDOMNode; out aValue: UnicodeString): Boolean;
  161. class function TryGetInt (const aNode: TDOMNode; out aValue: Int64): Boolean;
  162. class function TryGetFloat (const aNode: TDOMNode; out aValue: Double): Boolean;
  163. class function TryGetBool (const aNode: TDOMNode; out aValue: Boolean): Boolean;
  164. class function Nodes (const aElement: TDOMElement; const aName: DOMString = ''): IutlNodeEnumerator;
  165. class function PrependNode (const aElement: TDOMElement; const aName: DOMString): TDOMElement;
  166. class function AppendNode (const aElement: TDOMElement; const aName: DOMString): TDOMElement;
  167. class procedure PrependText (const aElement: TDOMElement; const aText: DOMString);
  168. class procedure AppendText (const aElement: TDOMElement; const aText: DOMString);
  169. end;
  170. implementation
  171. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  172. //TutlNodeEnumerator/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  173. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  174. function TutlNodeEnumerator.GetEnumerator: IutlNodeEnumerator;
  175. begin
  176. result := self;
  177. end;
  178. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  179. function TutlNodeEnumerator.GetCurrent: TDOMElement;
  180. begin
  181. result := (fParent.ChildNodes[fIndex] as TDOMElement);
  182. end;
  183. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  184. function TutlNodeEnumerator.MoveNext: Boolean;
  185. var
  186. c: Integer;
  187. begin
  188. c := fParent.ChildNodes.Count;
  189. repeat
  190. inc(fIndex)
  191. until (fIndex >= c)
  192. or ( (fParent.ChildNodes[fIndex] is TDOMElement)
  193. and ( (fName = '')
  194. or (fName = fParent.ChildNodes[fIndex].NodeName)));
  195. result := (fIndex < c);
  196. end;
  197. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  198. procedure TutlNodeEnumerator.Reset;
  199. begin
  200. fIndex := -1;
  201. end;
  202. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  203. constructor TutlNodeEnumerator.Create(const aParent: TDOMElement; const aName: DOMString);
  204. begin
  205. inherited Create;
  206. fParent := aParent;
  207. fName := aName;
  208. fIndex := -1;
  209. end;
  210. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  211. //TutlXmlHelper//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  212. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  213. function TutlXmlHelper.GetElement: TDOMElement;
  214. begin
  215. result := fElement;
  216. end;
  217. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  218. procedure TutlXmlHelper.SetString(const aValue: String);
  219. begin
  220. TutlXmlHelper.SetString(fElement, aValue);
  221. end;
  222. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  223. procedure TutlXmlHelper.SetString(const aValue: WideString);
  224. begin
  225. TutlXmlHelper.SetString(fElement, aValue);
  226. end;
  227. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  228. procedure TutlXmlHelper.SetString(const aValue: UnicodeString);
  229. begin
  230. TutlXmlHelper.SetString(fElement, aValue);
  231. end;
  232. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  233. procedure TutlXmlHelper.SetInt(const aValue: Integer);
  234. begin
  235. TutlXmlHelper.SetInt(fElement, aValue);
  236. end;
  237. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  238. procedure TutlXmlHelper.SetFloat(const aValue: Double);
  239. begin
  240. TutlXmlHelper.SetFloat(fElement, aValue);
  241. end;
  242. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  243. procedure TutlXmlHelper.SetBool(const aValue: Boolean);
  244. begin
  245. TutlXmlHelper.SetBool(fElement, aValue);
  246. end;
  247. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  248. function TutlXmlHelper.GetString(const aDefault: String): String;
  249. begin
  250. result := TutlXmlHelper.GetString(fElement, aDefault);
  251. end;
  252. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  253. function TutlXmlHelper.GetStringW(const aDefault: WideString): WideString;
  254. begin
  255. result := TutlXmlHelper.GetStringW(fElement, aDefault);
  256. end;
  257. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  258. function TutlXmlHelper.GetStringU(const aDefault: UnicodeString): UnicodeString;
  259. begin
  260. result := TutlXmlHelper.GetStringU(fElement, aDefault);
  261. end;
  262. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  263. function TutlXmlHelper.GetInt(const aDefault: Int64): Int64;
  264. begin
  265. result := TutlXmlHelper.GetInt(fElement, aDefault);
  266. end;
  267. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  268. function TutlXmlHelper.GetFloat(const aDefault: Double): Double;
  269. begin
  270. result := TutlXmlHelper.GetFloat(fElement, aDefault);
  271. end;
  272. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  273. function TutlXmlHelper.GetBool(const aDefault: Boolean): Boolean;
  274. begin
  275. result := TutlXmlHelper.GetBool(fElement, aDefault);
  276. end;
  277. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  278. procedure TutlXmlHelper.SetAttribString(const aName: DOMString; const aValue: String);
  279. begin
  280. fElement.SetAttributeNode(TutlXmlHelper.SetString(
  281. fElement.OwnerDocument.CreateAttribute(aName),
  282. aValue) as TDOMAttr);
  283. end;
  284. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  285. procedure TutlXmlHelper.SetAttribString(const aName: DOMString; const aValue: WideString);
  286. begin
  287. fElement.SetAttributeNode(TutlXmlHelper.SetString(
  288. fElement.OwnerDocument.CreateAttribute(aName),
  289. aValue) as TDOMAttr);
  290. end;
  291. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  292. procedure TutlXmlHelper.SetAttribString(const aName: DOMString; const aValue: UnicodeString);
  293. begin
  294. fElement.SetAttributeNode(TutlXmlHelper.SetString(
  295. fElement.OwnerDocument.CreateAttribute(aName),
  296. aValue) as TDOMAttr);
  297. end;
  298. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  299. procedure TutlXmlHelper.SetAttribInt(const aName: DOMString; const aValue: Integer);
  300. begin
  301. fElement.SetAttributeNode(TutlXmlHelper.SetInt(
  302. fElement.OwnerDocument.CreateAttribute(aName),
  303. aValue) as TDOMAttr);
  304. end;
  305. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  306. procedure TutlXmlHelper.SetAttribFloat(const aName: DOMString; const aValue: Double);
  307. begin
  308. fElement.SetAttributeNode(TutlXmlHelper.SetFloat(
  309. fElement.OwnerDocument.CreateAttribute(aName),
  310. aValue) as TDOMAttr);
  311. end;
  312. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  313. procedure TutlXmlHelper.SetAttribBool(const aName: DOMString; const aValue: Boolean);
  314. begin
  315. fElement.SetAttributeNode(TutlXmlHelper.SetBool(
  316. fElement.OwnerDocument.CreateAttribute(aName),
  317. aValue) as TDOMAttr);
  318. end;
  319. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  320. function TutlXmlHelper.GetAttribString(const aName: DOMString; const aDefault: String): String;
  321. begin
  322. result := TutlXmlHelper.GetString(fElement.Attributes.GetNamedItem(aName), aDefault);
  323. end;
  324. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  325. function TutlXmlHelper.GetAttribStringW(const aName: DOMString; const aDefault: WideString): WideString;
  326. begin
  327. result := TutlXmlHelper.GetStringW(fElement.Attributes.GetNamedItem(aName), aDefault);
  328. end;
  329. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  330. function TutlXmlHelper.GetAttribStringU(const aName: DOMString; const aDefault: UnicodeString): UnicodeString;
  331. begin
  332. result := TutlXmlHelper.GetStringU(fElement.Attributes.GetNamedItem(aName), aDefault);
  333. end;
  334. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  335. function TutlXmlHelper.GetAttribInt(const aName: DOMString; const aDefault: Int64): Int64;
  336. begin
  337. result := TutlXmlHelper.GetInt(fElement.Attributes.GetNamedItem(aName), aDefault);
  338. end;
  339. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  340. function TutlXmlHelper.GetAttribFloat(const aName: DOMString; const aDefault: Double): Double;
  341. begin
  342. result := TutlXmlHelper.GetFloat(fElement.Attributes.GetNamedItem(aName), aDefault);
  343. end;
  344. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  345. function TutlXmlHelper.GetAttribBool(const aName: DOMString; const aDefault: Boolean): Boolean;
  346. begin
  347. result := TutlXmlHelper.GetBool(fElement.Attributes.GetNamedItem(aName), aDefault);
  348. end;
  349. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  350. function TutlXmlHelper.TryGetAttribString(const aName: DOMString; out aValue: String): Boolean;
  351. begin
  352. result := TutlXmlHelper.TryGetString(fElement.Attributes.GetNamedItem(aName), aValue);
  353. end;
  354. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  355. function TutlXmlHelper.TryGetAttribStringW(const aName: DOMString; out aValue: WideString): Boolean;
  356. begin
  357. result := TutlXmlHelper.TryGetStringW(fElement.Attributes.GetNamedItem(aName), aValue);
  358. end;
  359. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  360. function TutlXmlHelper.TryGetAttribStringU(const aName: DOMString; out aValue: UnicodeString): Boolean;
  361. begin
  362. result := TutlXmlHelper.TryGetStringU(fElement.Attributes.GetNamedItem(aName), aValue);
  363. end;
  364. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  365. function TutlXmlHelper.TryGetAttribInt(const aName: DOMString; out aValue: Int64): Boolean;
  366. begin
  367. result := TutlXmlHelper.TryGetInt(fElement.Attributes.GetNamedItem(aName), aValue);
  368. end;
  369. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  370. function TutlXmlHelper.TryGetAttribFloat(const aName: DOMString; out aValue: Double): Boolean;
  371. begin
  372. result := TutlXmlHelper.TryGetFloat(fElement.Attributes.GetNamedItem(aName), aValue);
  373. end;
  374. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  375. function TutlXmlHelper.TryGetAttribBool(const aName: DOMString; out aValue: Boolean): Boolean;
  376. begin
  377. result := TutlXmlHelper.TryGetBool(fElement.Attributes.GetNamedItem(aName), aValue);
  378. end;
  379. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  380. function TutlXmlHelper.Nodes(const aName: DOMString): IutlNodeEnumerator;
  381. begin
  382. result := TutlXmlHelper.Nodes(fElement, aName);
  383. end;
  384. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  385. function TutlXmlHelper.PrependNode(const aName: DOMString): TDOMElement;
  386. begin
  387. result := TutlXmlHelper.PrependNode(fElement, aName);
  388. end;
  389. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  390. function TutlXmlHelper.AppendNode(const aName: DOMString): TDOMElement;
  391. begin
  392. result := TutlXmlHelper.AppendNode(fElement, aName);
  393. end;
  394. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  395. procedure TutlXmlHelper.PrependText(const aText: DOMString);
  396. begin
  397. TutlXmlHelper.PrependText(fElement, aText);
  398. end;
  399. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  400. procedure TutlXmlHelper.AppendText(const aText: DOMString);
  401. begin
  402. TutlXmlHelper.AppendText(fElement, aText);
  403. end;
  404. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  405. constructor TutlXmlHelper.Create;
  406. begin
  407. inherited Create;
  408. fElement := nil;
  409. end;
  410. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  411. constructor TutlXmlHelper.Create(const aElement: TDOMElement);
  412. begin
  413. Create;
  414. fElement := aElement;
  415. end;
  416. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  417. class function TutlXmlHelper.Create(const aElement: TDOMElement): IutlXmlHelper;
  418. begin
  419. result := TutlXmlHelper.Create(aElement);
  420. end;
  421. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  422. class function TutlXmlHelper.SetString(const aNode: TDOMNode; const aValue: String): TDOMNode;
  423. begin
  424. result := aNode;
  425. if Assigned(aNode) then
  426. aNode.TextContent := DOMString(aValue);
  427. end;
  428. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  429. class function TutlXmlHelper.SetString(const aNode: TDOMNode; const aValue: WideString): TDOMNode;
  430. begin
  431. result := aNode;
  432. if Assigned(aNode) then
  433. aNode.TextContent := DOMString(aValue);
  434. end;
  435. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  436. class function TutlXmlHelper.SetString(const aNode: TDOMNode; const aValue: UnicodeString): TDOMNode;
  437. begin
  438. result := aNode;
  439. if Assigned(aNode) then
  440. aNode.TextContent := DOMString(aValue);
  441. end;
  442. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  443. class function TutlXmlHelper.SetInt(const aNode: TDOMNode; const aValue: Integer): TDOMNode;
  444. begin
  445. result := aNode;
  446. if Assigned(aNode) then
  447. aNode.TextContent := DOMString(IntToStr(aValue));
  448. end;
  449. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  450. class function TutlXmlHelper.SetFloat(const aNode: TDOMNode; const aValue: Double): TDOMNode;
  451. begin
  452. result := aNode;
  453. if Assigned(aNode) then
  454. aNode.TextContent := DOMString(FloatToStr(aValue));
  455. end;
  456. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  457. class function TutlXmlHelper.SetBool(const aNode: TDOMNode; const aValue: Boolean): TDOMNode;
  458. begin
  459. result := aNode;
  460. if Assigned(aNode) then begin
  461. if aValue
  462. then aNode.TextContent := 'true'
  463. else aNode.TextContent := 'false';
  464. end;
  465. end;
  466. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  467. class function TutlXmlHelper.GetString(const aNode: TDOMNode; const aDefault: String): String;
  468. begin
  469. if not TryGetString(aNode, result) then
  470. result := aDefault;
  471. end;
  472. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  473. class function TutlXmlHelper.GetStringW(const aNode: TDOMNode; const aDefault: WideString): WideString;
  474. begin
  475. if not TryGetStringW(aNode, result) then
  476. result := aDefault;
  477. end;
  478. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  479. class function TutlXmlHelper.GetStringU(const aNode: TDOMNode; const aDefault: UnicodeString): UnicodeString;
  480. begin
  481. if not TryGetStringU(aNode, result) then
  482. result := aDefault;
  483. end;
  484. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  485. class function TutlXmlHelper.GetInt(const aNode: TDOMNode; const aDefault: Int64): Int64;
  486. begin
  487. if not TryGetInt(aNode, result) then
  488. result := aDefault;
  489. end;
  490. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  491. class function TutlXmlHelper.GetFloat(const aNode: TDOMNode; const aDefault: Double): Double;
  492. begin
  493. if not TryGetFloat(aNode, result) then
  494. result := aDefault;
  495. end;
  496. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  497. class function TutlXmlHelper.GetBool(const aNode: TDOMNode; const aDefault: Boolean): Boolean;
  498. begin
  499. if not TryGetBool(aNode, result) then
  500. result := aDefault;
  501. end;
  502. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  503. class function TutlXmlHelper.TryGetString(const aNode: TDOMNode; out aValue: String): Boolean;
  504. begin
  505. result := Assigned(aNode)
  506. and ( aNode.HasChildNodes
  507. or (aNode is TDOMText));
  508. if result then
  509. aValue := String(aNode.TextContent);
  510. end;
  511. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  512. class function TutlXmlHelper.TryGetStringW(const aNode: TDOMNode; out aValue: WideString): Boolean;
  513. begin
  514. result := Assigned(aNode)
  515. and ( aNode.HasChildNodes
  516. or (aNode is TDOMText));
  517. if result then
  518. aValue := WideString(aNode.TextContent);
  519. end;
  520. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  521. class function TutlXmlHelper.TryGetStringU(const aNode: TDOMNode; out aValue: UnicodeString): Boolean;
  522. begin
  523. result := Assigned(aNode)
  524. and ( aNode.HasChildNodes
  525. or (aNode is TDOMText));
  526. if result then
  527. aValue := UnicodeString(aNode.TextContent);
  528. end;
  529. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  530. class function TutlXmlHelper.TryGetInt(const aNode: TDOMNode; out aValue: Int64): Boolean;
  531. begin
  532. result := Assigned(aNode)
  533. and ( aNode.HasChildNodes
  534. or (aNode is TDOMText))
  535. and TryStrToInt64(String(aNode.TextContent), aValue);
  536. end;
  537. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  538. class function TutlXmlHelper.TryGetFloat(const aNode: TDOMNode; out aValue: Double): Boolean;
  539. begin
  540. result := Assigned(aNode)
  541. and ( aNode.HasChildNodes
  542. or (aNode is TDOMText))
  543. and TryStrToFloat(String(aNode.TextContent), aValue);
  544. end;
  545. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  546. class function TutlXmlHelper.TryGetBool(const aNode: TDOMNode; out aValue: Boolean): Boolean;
  547. var
  548. s: String;
  549. begin
  550. result := TryGetString(aNode, s);
  551. if result then begin
  552. if (s = 'true') or (s = 't') or (s = '1')
  553. then aValue := true
  554. else aValue := false;
  555. end;
  556. end;
  557. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  558. class function TutlXmlHelper.Nodes(const aElement: TDOMElement; const aName: DOMString): IutlNodeEnumerator;
  559. begin
  560. result := TutlNodeEnumerator.Create(aElement, aName);
  561. end;
  562. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  563. class function TutlXmlHelper.PrependNode(const aElement: TDOMElement; const aName: DOMString): TDOMElement;
  564. begin
  565. result := aElement.OwnerDocument.CreateElement(aName);
  566. if aElement.HasChildNodes
  567. then aElement.InsertBefore(result, aElement.FirstChild)
  568. else aElement.AppendChild(result);
  569. end;
  570. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  571. class function TutlXmlHelper.AppendNode(const aElement: TDOMElement; const aName: DOMString): TDOMElement;
  572. begin
  573. result := aElement.OwnerDocument.CreateElement(aName);
  574. aElement.AppendChild(result);
  575. end;
  576. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  577. class procedure TutlXmlHelper.PrependText(const aElement: TDOMElement; const aText: DOMString);
  578. var n: TDOMNode;
  579. begin
  580. n := aElement.OwnerDocument.CreateTextNode(aText);
  581. if aElement.HasChildNodes
  582. then aElement.InsertBefore(n, aElement.FirstChild)
  583. else aElement.AppendChild(n);
  584. end;
  585. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  586. class procedure TutlXmlHelper.AppendText(const aElement: TDOMElement; const aText: DOMString);
  587. begin
  588. aElement.AppendChild(aElement.OwnerDocument.CreateTextNode(aText));
  589. end;
  590. end.