[snip]
<Register Station="A">
<Purchase Date="12/13/2004" Time="14:26:03" DateTime="20041213142603" Order="1">
<Buyer CustomerID="1234" />
<Item UPC="04905004" Price="0.40"/>
<Description>Cherry Coca-Cola</Description>
</Purchase>
<Purchase Date="12/13/2004" Time="14:26:14" DateTime="20041213142614" Order="1">
<Buyer CustomerID="1234" />
<Item UPC="03424005" Price="0.65"/>
<Description>Hershey's Chocolate Bar</Description>
</Purchase>
<Purchase Date="12/13/2004" Time="15:09:25" DateTime="20041213150925" Order="2">
<Buyer CustomerID="4567" />
<Item UPC="02880125" Price="6.95"/>
<Description>Marlboro Cigarettes</Description>
</Purchase>
</Register>
In other words, Bob had two customers. The first customer bought two items (Order 1), and the second customer bought one item (Order 2).
Each register spits out a tape like this, starting with Order=1 and continuing until the store closes. At the end of the day, Bob would like to feed these tapes into his computer running Revolution and get one "tape" of all his items, re-numbered sequentially.
* Bob can't just tape them together (append them) because the Order numbers would conflict. Each register starts numbering at "1" when the store opens.
* There will never be overlapping orders; only one cash register is active at any given time. (Bob is a sole proprietor who runs from one to the other.)
The problem is, I don't know how to manipulate blocks of XML like this. Do I have to convert the whole XML file into some kind of table first? Do I have to walk through each and every node and every attribute? Is there nothing like "sort lines of foobar ascending by item 5 of each?" Actually, I don't even know how to walk through the nodes since the functions only seem to return the first instance...
I really would like to do something like select/extract all the Purchases where the Order ID = n and bring along all the related attributed and child elements. But I haven't a clue how to do that.
I've gotten as far as I have through reading the "XML Demo 1" stack and "XML construction kit" but I've hit a wall now. Some helpful advice would be very welcome... and posisbly helpful for other XML newbies on the list.
Bill
Bill,
I'm having trouble posting to the list?
Being new here you would not know about my pull-parsers. This task of yours could be handled so easy with a pull parser. First of all you could create an array of purchase objects using my pull-parser function for creating an array out of multiple XML elements, in your case , purchases. So here it is done for you:
Step 1. put XML data of cash register a & cash register b into gBothXMLtapes ( field "stashHere" )
Step 2. Use my pull-parser functions to create one array of all purchase data (see functions below)
...paste the functions below into your application at some button before using them.
======== Use this in a button click:
-- Paste all this below into a button & use field "stashHere" -- to enter your XML & field "show" to see the results.
on mouseUp
put the text of field "stashHere" into gBothXMLtapes
put 1 into spot
put "" into stashAttributesDT
put "" into gTransXML
put "<Purchase " into t1
put "</Purchase>" into t2
put "" into tempXML
put getElementsArray(t1, t2, gBothXMLtapes) into bothTapesArray
repeat
put bothTapesArray[spot] into stashThis
if stashThis = empty then exit repeat
put getAttribute("DateTime", stashThis) into tAttributeDT
delete char 1 to 8 of tAttributeDT
put tAttributeDT & return after stashAttributesDT
put "<" & tAttributeDT & ">" into a1
put "</" & tAttributeDT & ">" into a2
put a1 & t1 & stashThis & t2 & a2 into zapped
put zapped & return after tempXML
add 1 to spot
end repeat
sort lines of stashAttributesDT
-- this sorting is the solution based on your XML and the use by two cash registers.
put 1 into spot2
put "<xml>" & return into newXMLDoc
repeat for each line X in stashAttributesDT
put "<" & X & ">" into z1
put "</" & X & ">" into z2
put getElement(z1, z2, tempXML) into tXmlElement
put return & tXmlElement & return after newXMLDoc
end repeat
put "</xml>" & return after newXMLDoc
put newXMLDoc into field "show"
end mouseUp
-- That's it. You now have a newly transformed single XML document based on the Date-Time attribute that -- will appear in the "show" text field.
-- I hope that helps, -- Mark
--=========================== --===========================
--Paste these functions: -- put getElement("<record>", "</record>", tVar) into theElement function getElement tStTag, tEdTag, stngToSch put empty into zapped put the number of chars in tStTag into dChars put offset(tStTag,stngToSch) into tNum1 put offset(tEdTag,stngToSch) into tNum2 if tNum1 < 1 then return "error" exit getElement end if if tNum2 < 1 then return "error" exit getElement end if put char (tNum1 + dChars) to (tNum2 - 1) of stngToSch into zapped return zapped end getElement
-- put getAttribute("name", tVar) into theAttribute function getAttribute tAttribute, strngToSearch put empty into zapA put quote into Qx if char 1 of tAttribute = space then put tAttribute & "=" & Qx into tAttributeX else put space & tAttribute & "=" & Qx into tAttributeX end if put the number of chars in tAttributeX into dChars put offset(tAttributeX,strngToSearch) into tNum1 if tNum1 < 1 then return "error" exit getAttribute end if put tNum1 + dChars into tNumX put offset(Qx,strngToSearch,tNumX) into tNumZ if tNumX < 1 then return "error" exit getAttribute end if if tNumZ < 1 then return "error" exit getAttribute end if put char tNumX to (tNumX + (tNumZ - 1)) of strngToSearch into zapA return zapA end getAttribute
-- put getElementsArray("<record>", "</record>", tVar) into theArray
function getElementsArray tStartTag, tEndTag, StringToSearch
put empty into tArray
put 0 into tStart1
put 0 into tStart2
put 1 into tElementNum
put the number of chars in tStartTag into dChars
repeat
put offset(tStartTag,StringToSearch,tStart1) into tNum1
put (tNum1 + tStart1) into tStart1
if tNum1 < 1 then exit repeat
put offset(tEndTag,StringToSearch,tStart2) into tNum2
put (tNum2 + tStart2) into tStart2
if tNum2 < 1 then exit repeat
--if tNum2 < tNum1 then exit repeat
put char (tStart1 + dChars) to (tStart2 - 1) of StringToSearch into zapped
put zapped into tArray[tElementNum]
add 1 to tElementNum
end repeat
return tArray
end getElementsArray
_______________________________________________ use-revolution mailing list [EMAIL PROTECTED] http://lists.runrev.com/mailman/listinfo/use-revolution