[613] | 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))
|
---|