| 1 | MXMLDOM ;SAIC/DKM - XML Parser - DOM model ;02/27/2002  13:24 | 
|---|
| 2 | ;;7.3;TOOLKIT;**58**;Apr 25, 1995 | 
|---|
| 3 | ;================================================================= | 
|---|
| 4 | ; This acts as an intermediate client between the event-based XML | 
|---|
| 5 | ; parser and a client requiring an in-memory document model. | 
|---|
| 6 | EN(DOC,OPTION) ; | 
|---|
| 7 | N CBK,SUCCESS,LEVEL,NODE,HANDLE | 
|---|
| 8 | K ^TMP("MXMLERR",$J) | 
|---|
| 9 | L +^TMP("MXMLDOM",$J):5 | 
|---|
| 10 | E  Q 0 | 
|---|
| 11 | S HANDLE=$O(^TMP("MXMLDOM",$J,""),-1)+1,^(HANDLE)="" | 
|---|
| 12 | L -^TMP("MXMLDOM",$J) | 
|---|
| 13 | S CBK("STARTELEMENT")="STARTELE^MXMLDOM" | 
|---|
| 14 | S CBK("ENDELEMENT")="ENDELE^MXMLDOM" | 
|---|
| 15 | S CBK("COMMENT")="COMMENT^MXMLDOM" | 
|---|
| 16 | S CBK("CHARACTERS")="CHAR^MXMLDOM" | 
|---|
| 17 | S CBK("ENDDOCUMENT")="ENDDOC^MXMLDOM" | 
|---|
| 18 | S CBK("ERROR")="ERROR^MXMLDOM" | 
|---|
| 19 | S (SUCCESS,LEVEL,LEVEL(0),NODE)=0,OPTION=$G(OPTION,"V1") | 
|---|
| 20 | D EN^MXMLPRSE(DOC,.CBK,OPTION) | 
|---|
| 21 | D:'SUCCESS DELETE(HANDLE) | 
|---|
| 22 | Q $S(SUCCESS:HANDLE,1:0) | 
|---|
| 23 | ; Start element | 
|---|
| 24 | ; Create new child node and push info on stack | 
|---|
| 25 | STARTELE(ELE,ATTR) ; | 
|---|
| 26 | N PARENT | 
|---|
| 27 | S PARENT=LEVEL(LEVEL),NODE=NODE+1 | 
|---|
| 28 | S:PARENT ^TMP("MXMLDOM",$J,HANDLE,PARENT,"C",NODE)=ELE | 
|---|
| 29 | S LEVEL=LEVEL+1,LEVEL(LEVEL)=NODE,LEVEL(LEVEL,0)=ELE | 
|---|
| 30 | S ^TMP("MXMLDOM",$J,HANDLE,NODE)=ELE,^(NODE,"P")=PARENT | 
|---|
| 31 | M ^("A")=ATTR | 
|---|
| 32 | Q | 
|---|
| 33 | ; End element | 
|---|
| 34 | ; Pops element stack | 
|---|
| 35 | ENDELE(ELE) ; | 
|---|
| 36 | K LEVEL(LEVEL) | 
|---|
| 37 | S LEVEL=LEVEL-1 | 
|---|
| 38 | Q | 
|---|
| 39 | ; Comment data | 
|---|
| 40 | COMMENT(TXT) ; | 
|---|
| 41 | D TXT("X") | 
|---|
| 42 | Q | 
|---|
| 43 | ; Character data | 
|---|
| 44 | CHAR(TXT) ; | 
|---|
| 45 | D TXT("T") | 
|---|
| 46 | Q | 
|---|
| 47 | ; Store comment or character data | 
|---|
| 48 | TXT(SUB) N X,Y,Z | 
|---|
| 49 | S Y=$O(^TMP("MXMLDOM",$J,HANDLE,LEVEL(LEVEL),SUB,""),-1) | 
|---|
| 50 | I Y>0,($L($G(^(Y)))+$L(TXT)>200)!($G(BGN)["CDATA") S Y=Y+1 ;*rwf | 
|---|
| 51 | S:'Y Y=1 | 
|---|
| 52 | F Z=$L(TXT,$C(10)):-1:1 Q:TXT=""  D | 
|---|
| 53 | .S X=$P(TXT,$C(10)),TXT=$P(TXT,$C(10),2,9999) | 
|---|
| 54 | .S ^(Y)=$G(^(Y))_X | 
|---|
| 55 | .S:Z>1 Y=Y+1 ;*rwf old .S:Z>1 Y=Y+1,^(Y)="" | 
|---|
| 56 | Q | 
|---|
| 57 | ; End of document | 
|---|
| 58 | ENDDOC S SUCCESS=1 | 
|---|
| 59 | Q | 
|---|
| 60 | ;Error reporting | 
|---|
| 61 | ERROR(ERR) ; | 
|---|
| 62 | N CNT | 
|---|
| 63 | S CNT=1+$G(^TMP("MXMLERR",$J)),^($J)=CNT | 
|---|
| 64 | M ^TMP("MXMLERR",$J,CNT)=ERR | 
|---|
| 65 | Q | 
|---|
| 66 | ; | 
|---|
| 67 | ; Below are the external API calls for the interface | 
|---|
| 68 | ; | 
|---|
| 69 | ; Delete document instance | 
|---|
| 70 | DELETE(HANDLE) ; | 
|---|
| 71 | K ^TMP("MXMLDOM",$J,HANDLE) | 
|---|
| 72 | Q | 
|---|
| 73 | ; Name of element at node | 
|---|
| 74 | NAME(HANDLE,NODE) ; | 
|---|
| 75 | Q $G(^TMP("MXMLDOM",$J,HANDLE,NODE)) | 
|---|
| 76 | ; Node of next child | 
|---|
| 77 | CHILD(HANDLE,PARENT,CHILD) ; | 
|---|
| 78 | Q +$O(^TMP("MXMLDOM",$J,HANDLE,PARENT,"C",+$G(CHILD))) | 
|---|
| 79 | ; Node of next sibling | 
|---|
| 80 | SIBLING(HANDLE,NODE) ; | 
|---|
| 81 | Q +$O(^TMP("MXMLDOM",$J,HANDLE,$$PARENT(HANDLE,NODE),"C",NODE)) | 
|---|
| 82 | ; Parent of node | 
|---|
| 83 | PARENT(HANDLE,NODE) ; | 
|---|
| 84 | Q +$G(^TMP("MXMLDOM",$J,HANDLE,NODE,"P")) | 
|---|
| 85 | ; Text associated with node | 
|---|
| 86 | TEXT(HANDLE,NODE,RTN) ; | 
|---|
| 87 | D GETTXT("T") | 
|---|
| 88 | Q:$Q $D(@RTN)>1 | 
|---|
| 89 | Q | 
|---|
| 90 | ; Comment associate with node | 
|---|
| 91 | CMNT(HANDLE,NODE,RTN) ; | 
|---|
| 92 | D GETTXT("X") | 
|---|
| 93 | Q:$Q $D(@RTN)>1 | 
|---|
| 94 | Q | 
|---|
| 95 | ; Retrieve text or comment | 
|---|
| 96 | GETTXT(SUB) ; | 
|---|
| 97 | K @RTN | 
|---|
| 98 | M @RTN=^TMP("MXMLDOM",$J,HANDLE,NODE,SUB) | 
|---|
| 99 | Q | 
|---|
| 100 | ; Retrieve next attribute | 
|---|
| 101 | ATTRIB(HANDLE,NODE,ATTR) ; | 
|---|
| 102 | Q $O(^TMP("MXMLDOM",$J,HANDLE,NODE,"A",$G(ATTR))) | 
|---|
| 103 | ; Retrieve attribute value | 
|---|
| 104 | VALUE(HANDLE,NODE,ATTR) ; | 
|---|
| 105 | Q $G(^TMP("MXMLDOM",$J,HANDLE,NODE,"A",ATTR)) | 
|---|