-
Notifications
You must be signed in to change notification settings - Fork 2
TFPXMLBridge class/component handle XML document in a manner not usual, something like easy direct access (read/write/create/remove) to DOM XML nodes by way of namespace like "root.node1.node2.node3"...
jmpessoa/tfpxmlbridge
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
{ Author: Jose Marques Pessoa : jmpessoa__hotmail_com [1]Warning: at the moment this code is just a *proof-of-concept* TXMLBridge class/component handle XML document in a manner not usual, something like easy direct access (read/write/create/remove) to DOM XML nodes by way of namespace like "root.node1.node2.node3"... Indeed, TXMLBridge class/component is being built on top of already existing FCL-XML parser: XMLRead, XMLWrite, DOM units (TXMLDocument class, TDOMNode class , etc...). (*.........................................................................*) ::New Add unit regxmlbridges.pas - 08/21023 (*.........................................................................*) ::TTreeViewXmlBridge - Version 0.1 - 08/2013 ::New Add AppTreeViewXmlBridgeDemo1 ::New Add Component TreeViewXmlBridge (*.........................................................................*) TFPXMLBridge - Version 0.1 - 01/2013; ::revision 06 minor fix and add overload for SetValue and InsertNode... 15-august-2013 ::revision 05 add GetXMLAsString... 12-august-2013 ::revision 04 add LoadFromString... 06-april-2013 ::revision 03 add property public XMLDocument.... 02-march-2013 ::revision 02 - minor fix for GetDOMNodeReference... 24/february/2013 ::revision 02 - 23/February/2013 NEW Add suport for read/write Attributes NEW function GetAttrList(query: string): string; NEW function GetAttrValueByName(query: string; attrName: string) NEW procedure SetAttribute(query: string) NEW Add AppDemo3 ::revision 01 - 09/February/2013 NEW Sintaxe GetValue/SetValue by Node Index. NEW procedure SetCurrentNode(query: string). NEW change AppDemo1 (remove option "new documment") NEW Add AppDemo2 (here is the option "new documment") NEW Tips.. [2]Tokens "Language" : Warning: change this tokens if necessary... or Application will crash! NamespaceSeparatorToken: . BridgeLateBindingToken: * //default attribute=0 in late binding NameValueSeparatorToken: # //... equal AssignmentToken: $ //... Assignment ConcatenationToken: | AttributeNameValueStartToken: ( AttributeNameValueEndToken: ) AttributesSeparatorToken: ; IndexStartToken: [ IndexEndToken: ] [3] Sintaxe Example: 3.1.0 //take library as the root node: <?xml version="1.0" encoding="utf-8"?> <library> </library> Now, after the commands: InsertNode('library$book(id#100)') //create node <book id="100"> InsertNode('library$book(id#200)') //create node <book id="200"> the documment is: <?xml version="1.0" encoding="utf-8"?> <library> <book id="100"> </book> <book id="200"> </book> </library> 3.1.1 Insert item in library.book(100) //library is root node library.book(100)$item(id#1;name#lazarus guide) //sintaxe library.book(100) :namespace where some book attribute=100 $item :insert new node item (id#1;name#lazarus guide) :with attributes: name1#value1;name2#value2 3.1 Insert item in library.book library.book$item()out of print //sintaxe library.book :namespace base - first book child $item :insert new node item () :empty open/closed parenthesis: no attribute at all! out of print :inner/content text! 3.2 Set value in item(lazarus guide) library.book(100).item(lazarus guide)$in stock //sintaxe library.book(100) :namespace base $in stock :set item text inner/content/value =in stock :TIP 1 InsertNode: The path to the left of the token "$" must already exist! :TIP 2 InsertNode: If the right path of the token "$" not exists will be fully created! 3.3 Set value in author library.book(100).item(lazarus guide)author$Mattias Gartner //sintaxe library.book(100).item(lazarus guide) :namespace base ( :open token - attribute lazarus guide :item selected by attribute lazarus guide ) :close token - attribute author$Mattias Gartner :set author text content/inner/value = Mattias Gartner :TIP 3 SetValue: Note that the symbol/token "$" is always placed at the end of the path where you need/want to Set the value! 3.4 Generic Insert example: Insert nodes movie and item... then insert coauthor, publisher... library$movie(id#121).item(id#11;name#2001 A Space Odyssey).author()Stanley Kubrick //sintaxe library.movie(121).item(11)$coauthor()Arthur C Clarke //sintaxe library.movie(121).item(2001 A Space Odyssey)$publisher()Metro Goldwyn Mayer //sintaxe 3.5 Generic Get example: Get value by some attribute library.book(200).item(InstallOverdom help).publisher(B) library.book(200) :select book where some attribute=2 item(InstallOverdom help) :select item where some attribute=InstallOverdom help publisher(B) :select publisher where some attribute=B 3.6 Generic GetValue by nodeIndex: //library is root node InsertNode('library$stationery') //create node <stationery> InsertNode('library.stationery$item()pencil') //create node <item>pencil</item> InsertNode('library.stationery$item()pen') //create node <item>pen</item> InsertNode('library.stationery$item()eraser') //create node <item>eraser</item> InsertNode('library.stationery$item()notebook') //create node <item>notebook</item> //this code read each item value...by index! query:='library.stationery'; count:= FPXMLBridge1.CountElementNodeChildren(FPXMLBridge1.GetNode(query)); for i:=0 to count-1 do begin; query:= 'library.stationery.item['+intToStr(i)+']'; ShowMessage(FPXMLBridge1.GetValue(query)); end; 3.7 Generic SetValue by node index: //this code (re)write each item value...by index! query:='library.stationery'; count:= FPXMLBridge1.CountElementNodeChildren(FPXMLBridge1.GetNode(query)); for i:=0 to count-1 do begin; query:= 'library.stationery.item['+intToStr(i)+']'+'$'+intToStr(i*100); FPXMLBridge1.SetValue(query); FPXMLBridge1.SaveToFile(FPXMLBridge1.XMLDocumentPath); end; 3.8 Select path to go "on the fly": Get value by attribute index late binding - handled by OnBuildingBridge library.book(*).item(*).publisher(*) :select attribute index = [0] to all {default} library.book([0]).item([0]).publisher([1]) :select attribute index = [1] only to publisher... 3.9 Get all Attributes node... and attribute value by attribute name... query:= 'project.beams.beam(1).spans.span[1].loadp[0]'; if FPXMLBridge1.GetNode(query).HasAttributes then begin ShowMessage(FPXMLBridge1.GetAttrList(query)); ShowMessage(FPXMLBridge1.GetAttrValueByName(query, 'p')); end; 4.0 Set Attribute value....change attribute value or create new attribute //this code (re)write attribute... query:= 'project.beams.beam(1).spans.span[0]$(id#1)'; FPXMLBridge1.SetAttribute(query); query:= 'project.beams.beam(1).spans.span[1].loadp[0]$(p#444)'; FPXMLBridge1.SetAttribute(query); [4]Have fun! }
About
TFPXMLBridge class/component handle XML document in a manner not usual, something like easy direct access (read/write/create/remove) to DOM XML nodes by way of namespace like "root.node1.node2.node3"...
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published