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

Reply via email to