XML Q: Why data isn't showing in this procedure

Krokodile

New Member
Code Below is supposed to read an XML document & list all the tags (in ShowAll procedure) & all Data in (ShowDataOnly prcedure).
But this prcedure is working correctly only for Tags & isn't showing data at all. Eventhough data between tags is there I 'm displaying it in a message in block hChild:NAME = "#text". XML code is given below too you will see that it has the data in it.

Program code is (I took it from a website yesterday) :-
/* XMLparser.p
Dmitri Levin 07/31/2001
*/
DEFINE VARIABLE iLevel AS INTEGER NO-UNDO.
DEFINE VARIABLE Parentname AS CHARACTER NO-UNDO.
DEFINE TEMP-TABLE nodes NO-UNDO
FIELD NAME AS CHARACTER
FIELD nodevalue AS CHARACTER
FIELD PARENT AS CHARACTER
FIELD level AS INTEGER
.
RUN ProcessXML( INPUT "C:\cd1.xml":U ).
RUN ShowAll.
RUN ShowDataOnly.
PROCEDURE ProcessXML:
DEFINE INPUT PARAMETER XMLfilename AS CHARACTER NO-UNDO.
DEFINE VARIABLE hXML AS HANDLE NO-UNDO.
DEFINE VARIABLE hRoot AS HANDLE NO-UNDO.
EMPTY TEMP-TABLE nodes.
CREATE X-DOCUMENT hXML.
CREATE X-NODEREF hRoot.
hXML:LOAD('FILE':U, XMLfilename , FALSE).
/*Get the root element handle*/
hXML:GET-DOCUMENT-ELEMENT(hRoot).
Parentname = "ROOT".
RUN process-children( INPUT hRoot ).

DELETE OBJECT hXML.
DELETE OBJECT hRoot.
END. /* processXML */
PROCEDURE process-children:
DEFINE INPUT PARAMETER hParent AS HANDLE NO-UNDO.
DEFINE VARIABLE hChild AS HANDLE NO-UNDO.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
iLevel = iLevel + 1.
CREATE X-NODEREF hChild.
CREATE nodes.
ASSIGN
nodes.NAME = hParent:NAME
nodes.PARENT = Parentname
nodes.level = iLevel.
RUN processAttributes( INPUT hParent ).

DO i = 1 TO hParent:NUM-CHILDREN :
hParent:GET-CHILD(hChild,i).
IF hChild:NAME = "#text" THEN DO:
MESSAGE "Data is showing" nodes.PARENT ilevel hChild:NAME hChild:NODE-VALUE VIEW-AS ALERT-BOX.
ASSIGN
nodes.nodevalue = hChild:NODE-VALUE.
END.
ELSE DO:
parentname = hParent:NAME.
RUN process-children( INPUT hChild ).
END.
END.
iLevel = iLevel - 1.
DELETE OBJECT hChild.
END. /* process-child */
PROCEDURE processAttributes:
DEFINE INPUT PARAMETER hParent AS HANDLE NO-UNDO.
DEFINE VARIABLE cAttribute AS CHARACTER NO-UNDO.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE BUFFER nodes FOR nodes.
DO i = 1 TO NUM-ENTRIES(hParent:ATTRIBUTE-NAMES) TRANSACTION:
cAttribute = entry(i,hParent:ATTRIBUTE-NAMES).
CREATE nodes.
ASSIGN
nodes.NAME = cAttribute
nodes.PARENT = hParent:NAME
nodes.nodevalue = hParent:GET-ATTRIBUTE(cAttribute)
nodes.level = iLevel + 1.
END.
END. /* processAttributes */
PROCEDURE ShowAll:
FOR EACH nodes:
DISPLAY
FILL(" ", nodes.level) + nodes.NAME FORMAT "x(40)"
trim(nodes.nodevalue) FORMAT "x(20)" NO-LABEL
WITH TITLE "All Nodes in XML file".
END.
END. /* showall */
PROCEDURE ShowDataOnly:
FOR EACH nodes WHERE TRIM(nodes.nodevalue) <> "":
DISPLAY
nodes.PARENT + " " + nodes.NAME FORMAT "x(40)"
trim(nodes.nodevalue) FORMAT "x(20)" NO-LABEL
WITH TITLE "XML Data Only".
END.
END. /* showDataOnly */



XML i'm using is this
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!-- Edited with XML Spy v4.2 -->f(clean);
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
</CATALOG>
 

Krokodile

New Member
I've figured out the answer from Peg.com. Its because of whitespaces between content elements. If i convert my XML to one single line then i can see all data pulled by the program.
This works but its a weird solution that everytime i need to convert my XML to a single line first to be able to parse the data from tags.
I tried normalize() method as indiacted in some posts but that didn't do anything in removing whitespaces from XML.

Any take on this???
 
Top