I actually have a book in my cubicle with the title "Professional Visual Basic
6 XML" by Jame Britt, Teun Duynstee. Hmmm, I actually have more than 50 books
in here in my cubicle which includes "A New Kind of Science", "The Mythical
Man-Month", "Advance Dungeons and Dragons 2nd Edition" (both the Dungeon Master
Guide and Players Handbook) ...
So going back, cracking open the book again on VB6 XML, I realized how many
hoops an MS programmer has to jump through to write an XML document.
Take for example the following XML document:
<?xml version="1.0"?>
<data>
<user>
<name>Alex</name>
<city>Makati</city>
<country>Philippines</country>
</user>
<user>
<name>Vilma</name>
<city>Shenzen</city>
<country>China</country>
</user>
</data>
So let's say that we have the following data that has to be transformed to XML
in the format above:
[rawdata=: 2 3 $ 'Vilma';'Shenzen';'China';'Alex';'Makati';'Philippines'
+-----+-------+-----------+
|Vilma|Shenzen|China |
+-----+-------+-----------+
|Alex |Makati |Philippines|
+-----+-------+-----------+
Well, my idea is to create formatted nouns and just replace the values as shown
with this code:
NB. =========================================================
NB. [email protected] 2010 5 5 02 59 58.529
NB. Poor man XML writer
load 'files validate'
NB. ---------------------------------------------------------
NB. XML definition tags
XML_DATA_OPEN=: 0 : 0
<?xml version="1.0"?>
<data>
)
XML_DATA_CLOSE=: '</data>'
XML_USER_OPEN=: '<user>'
XML_USER_CLOSE=: '</user>'
XML_USER_MAP=: > '*' cutopen each cutopen 0 : 0
<name>*User Name*</name>
<city>*User City*</city>
<country>*User Country*</country>
)
NB. =========================================================
NB. Support verbs
boxEMPTY=: <''
boxitems=: <"_1 ^: (0: = L.)
boxedlist2mat=: [: |: boxitems &>
blankout=: 3 : 'boxEMPTY (bx y = <,'' '') } y'
mat2boxedlist=: 3 : 0
dat=. <"1 |: ,each y
opn=. > each dat
emp=. isempty &> opn
num=. bx emp < 2 ~: 3!:0 &> opn
dat=. (, each num { opn) num } dat
ndx=. (i.#dat) -. num
(blankout each ndx { dat) ndx } dat
)
charsep=: 3 : 0
',' charsep y
:
if. L. y do.
}. ; (x &, @ ":) each y
else.
, ": y
end.
)
parseUser=: 3 : 0
data=. y
temp=. '' charsep "1 boxedlist2mat (<data) 1 } mat2boxedlist XML_USER_MAP
XML_USER_OPEN,temp,XML_USER_CLOSE
)
NB. =========================================================
NB.*exportToXML a saves data to XML file
NB.
NB. x is: data that is 3 columns by N rows
NB. y is: filename
exportToXML=: 4 : 0
data=. mat2boxedlist "1 x
xmlfile=. y
temp=. '' charsep parseUser each data
xmlfile fwrites~ XML_DATA_OPEN,temp,XML_DATA_CLOSE
)
NB. =========================================================
NB. End of J script
If you would review the code above, I defined some constants first to handle
the tags like:
XML_DATA_OPEN
XML_DATA_CLOSE
XML_USER_OPEN
XML_USER_CLOSE
Then I defined a map with:
XML_USER_MAP
+----------+------------+----------+
| <name> |User Name |</name> |
+----------+------------+----------+
| <city> |User City |</city> |
+----------+------------+----------+
| <country>|User Country|</country>|
+----------+------------+----------+
The idea is to use the 2nd column to as to where to put the actual data. I
actually use the verb 'parseUser' to actually put the data into the
XML_USER_MAP.
So to run this, just execute:
rawdata exportToXML 'c:\test.xml'
416
Then verify the result in 'C:\TEST.XML' by opening it using FireFox or IE.
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm