| 1 | MXMLPRS1 ;SAIC/DKM - XML Parser ;12/04/2002  15:55 | 
|---|
| 2 | ;;7.3;TOOLKIT;**58,67**;Apr 25, 1995 | 
|---|
| 3 | ;================================================================= | 
|---|
| 4 | ; Initialize tables | 
|---|
| 5 | INIT N X,Y,Z | 
|---|
| 6 | F X=0:1 S Y=$P($T(ENTITIES+X),";;",2,99) Q:'$L(Y)  D | 
|---|
| 7 | .D SETENT^MXMLPRSE($P(Y,";"),$P(Y,";",2,99)) | 
|---|
| 8 | F X=0:1 S Y=$P($T(DTDTAG+X),";;",2,99) Q:'$L(Y)  D | 
|---|
| 9 | .S DTD($P(Y,";"))=$P(Y,";",2) | 
|---|
| 10 | F X=0:1 S Y=$P($T(TYPE+X),";;",2,99) Q:'$L(Y)  D | 
|---|
| 11 | .S ^TMP(ID,$J,"TYP",$P(Y,";",2))=+Y | 
|---|
| 12 | F X=0:1 S Y=$P($T(MOD+X),";;",2,99) Q:'$L(Y)  D | 
|---|
| 13 | .S ^TMP(ID,$J,"MOD",$P(Y,";",2))=+Y | 
|---|
| 14 | F X=0:1 S Y=$P($T(REF+X),";;",2,99) Q:'$L(Y)  D | 
|---|
| 15 | .S ^TMP(ID,$J,"REF",$P(Y,";",2))=+Y | 
|---|
| 16 | F X=0:1 S Y=$P($T(CBKARGS+X),";;",2,99) Q:'$L(Y)  D | 
|---|
| 17 | .S ^TMP(ID,$J,"CBK",$P(Y,";",2))=+Y | 
|---|
| 18 | F X=0:1 S Y=$P($T(PROLOG+X),";;",2,99) Q:'$L(Y)  D | 
|---|
| 19 | .S Z=$P(Y,";"),^TMP(ID,$J,"ATT","?xml",Z)="1^"_$S('X:1,1:2) | 
|---|
| 20 | .F  S Y=$P(Y,";",2,99) Q:'$L(Y)  S ^TMP(ID,$J,"ATT","?xml",Z,$P(Y,";"))="" | 
|---|
| 21 | Q | 
|---|
| 22 | ; Search parse tree for child element (CHILD) under parent element | 
|---|
| 23 | ; (ELEMENT) starting at specified node (NODE). | 
|---|
| 24 | ; Returns next node # in parse tree or 0 | 
|---|
| 25 | ; If validation is disabled, the function always returns 1. | 
|---|
| 26 | ; If parent element is marked as EMPTY, 0 is returned. | 
|---|
| 27 | ; If parent element is marked as ANY, 1 is returned. | 
|---|
| 28 | ISCHILD(ELEMENT,CHILD,NODE) ; | 
|---|
| 29 | N TRN | 
|---|
| 30 | S TRN=+$G(^TMP(ID,$J,"ELE",ELEMENT),2) | 
|---|
| 31 | Q $S(OPTION'["V"!'NODE:1,TRN=1:CHILD="*",TRN=2:1,1:$$IC(NODE)) | 
|---|
| 32 | IC(NODE) N X,Y | 
|---|
| 33 | S X=+$G(^TMP(ID,$J,"ELE",ELEMENT,NODE,CHILD)),Y=0 | 
|---|
| 34 | I 'X D | 
|---|
| 35 | .F  S Y=$O(^TMP(ID,$J,"ELE",ELEMENT,NODE,Y)) Q:'Y  D  Q:X | 
|---|
| 36 | ..S:'$D(TRN(NODE,Y)) TRN(NODE,Y)="",X=$$IC(Y) | 
|---|
| 37 | Q X | 
|---|
| 38 | ; Check attribute value for validity | 
|---|
| 39 | CHKVAL(ENAME,ANAME,VALUE) ; | 
|---|
| 40 | N TYPE,X,Y,Z | 
|---|
| 41 | Q:'$L(VALUE) | 
|---|
| 42 | I $D(^TMP(ID,$J,"ATT",ENAME,ANAME))>1 D:'$D(^(ANAME,VALUE)) ERROR(38,VALUE) Q | 
|---|
| 43 | S TYPE=+$G(^TMP(ID,$J,"ATT",ENAME,ANAME)) | 
|---|
| 44 | Q:'TYPE | 
|---|
| 45 | I TYPE=5 D  Q                                                         ; ID type | 
|---|
| 46 | .I '$$ISNAME(VALUE) D ERROR(38,VALUE) Q | 
|---|
| 47 | .I '$D(^TMP(ID,$J,"ID",VALUE)) D | 
|---|
| 48 | ..S ^(VALUE)="" | 
|---|
| 49 | ..D NOFWD("ID",VALUE) | 
|---|
| 50 | .E  D ERROR(28,VALUE) | 
|---|
| 51 | I TYPE=9!(TYPE=10) D  Q                                               ; ENTITY/ENTITIES type | 
|---|
| 52 | .S X=$S(TYPE=9:"  ",1:" ") | 
|---|
| 53 | .F Z=1:1:$L(VALUE,X) D FWD("UNP",$P(VALUE,X,Z)) | 
|---|
| 54 | I TYPE=3!(TYPE=4) D  Q                                                ; NMTOKEN/NMTOKENS type | 
|---|
| 55 | .S X=$S(TYPE=3:"  ",1:" ") | 
|---|
| 56 | .F Z=1:1:$L(VALUE,X) D | 
|---|
| 57 | ..S Y=$P(VALUE,X,Z) | 
|---|
| 58 | ..D:'$$ISNMTKN(Y) ERROR(38,Y) | 
|---|
| 59 | I TYPE=6!(TYPE=7) D  Q                                                ; IDREF/IDREFS type | 
|---|
| 60 | .S X=$S(TYPE=6:"  ",1:" ") | 
|---|
| 61 | .F Z=1:1:$L(VALUE,X) D | 
|---|
| 62 | ..S Y=$P(VALUE,X,Z) | 
|---|
| 63 | ..I '$$ISNAME(Y) D ERROR(38,Y) Q | 
|---|
| 64 | ..D FWD("ID",Y) | 
|---|
| 65 | Q | 
|---|
| 66 | ; Return true if valid name | 
|---|
| 67 | ISNAME(VALUE) ; | 
|---|
| 68 | Q VALUE?1(1A,1"_",1":").(1AN,1".",1"-",1"_",1":") | 
|---|
| 69 | ; Return true if valid name token | 
|---|
| 70 | ISNMTKN(VALUE) ; | 
|---|
| 71 | Q VALUE?1.(1AN,1".",1"-",1"_",1":") | 
|---|
| 72 | ; Log a forward reference | 
|---|
| 73 | FWD(TYPE,VALUE) ; | 
|---|
| 74 | Q:'$L(VALUE) | 
|---|
| 75 | Q:$D(^TMP(ID,$J,TYPE,VALUE)) | 
|---|
| 76 | N Z | 
|---|
| 77 | S Z=$O(^TMP(ID,$J,"REF",TYPE,VALUE,""),-1)+1 | 
|---|
| 78 | M ^(Z)=ERR | 
|---|
| 79 | Q | 
|---|
| 80 | ; Resolve forward reference | 
|---|
| 81 | NOFWD(TYPE,VALUE) ; | 
|---|
| 82 | K ^TMP(ID,$J,"REF",TYPE,VALUE) | 
|---|
| 83 | Q | 
|---|
| 84 | ; Signal unresolved references | 
|---|
| 85 | UNRESLV N X,Y,Z,E | 
|---|
| 86 | F X=1:1:LVL D | 
|---|
| 87 | .K ERR | 
|---|
| 88 | .M ERR=LVL(X) | 
|---|
| 89 | .D ERROR(8,LVL(X)) | 
|---|
| 90 | S X="" | 
|---|
| 91 | F  S X=$O(^TMP(ID,$J,"REF",X)),Y="" Q:'$L(X)  D                           ; Look for IDREF w/o corresponding ID value | 
|---|
| 92 | .S E=^(X) | 
|---|
| 93 | .F  S Y=$O(^TMP(ID,$J,"REF",X,Y)),Z=0 Q:'$L(Y)  D | 
|---|
| 94 | ..F  S Z=$O(^TMP(ID,$J,"REF",X,Y,Z)) Q:'Z  D | 
|---|
| 95 | ...K ERR | 
|---|
| 96 | ...M ERR=^(Z) | 
|---|
| 97 | ...D ERROR(E,Y) | 
|---|
| 98 | Q | 
|---|
| 99 | ; Log error | 
|---|
| 100 | ERROR(X,Y) D ERROR^MXMLPRSE(.X,.Y) Q | 
|---|
| 101 | ; Predefined general entities | 
|---|
| 102 | ; Format=entity name;entity value | 
|---|
| 103 | ENTITIES ;;amp;& | 
|---|
| 104 | ;;lt;< | 
|---|
| 105 | ;;gt;> | 
|---|
| 106 | ;;quot;" | 
|---|
| 107 | ;;apos;' | 
|---|
| 108 | ;; | 
|---|
| 109 | ; Callback events | 
|---|
| 110 | ; Format=#args;event type | 
|---|
| 111 | CBKARGS ;;0;STARTDOCUMENT | 
|---|
| 112 | ;;0;ENDDOCUMENT | 
|---|
| 113 | ;;3;DOCTYPE | 
|---|
| 114 | ;;1;CHARACTERS | 
|---|
| 115 | ;;2;STARTELEMENT | 
|---|
| 116 | ;;1;ENDELEMENT | 
|---|
| 117 | ;;3;NOTATION | 
|---|
| 118 | ;;2;PI | 
|---|
| 119 | ;;1;COMMENT | 
|---|
| 120 | ;;3;EXTERNAL | 
|---|
| 121 | ;;1;ERROR | 
|---|
| 122 | ;; | 
|---|
| 123 | ; Prolog attributes | 
|---|
| 124 | ; Format=attribute name;val1;val2;...;valn | 
|---|
| 125 | PROLOG ;;version;1.0 | 
|---|
| 126 | ;;encoding;UTF-8;utf-8 | 
|---|
| 127 | ;;standalone;no;yes | 
|---|
| 128 | ;; | 
|---|
| 129 | ; Recognized DTD tags | 
|---|
| 130 | ; Format=tag name;state | 
|---|
| 131 | DTDTAG ;;ENTITY;20 | 
|---|
| 132 | ;;ELEMENT;30 | 
|---|
| 133 | ;;ATTLIST;40 | 
|---|
| 134 | ;;NOTATION;50 | 
|---|
| 135 | ;;[;60 | 
|---|
| 136 | ;; | 
|---|
| 137 | ; Attribute types | 
|---|
| 138 | ; Format=identifier;type | 
|---|
| 139 | TYPE ;;1;( | 
|---|
| 140 | ;;2;CDATA | 
|---|
| 141 | ;;3;NMTOKEN | 
|---|
| 142 | ;;4;NMTOKENS | 
|---|
| 143 | ;;5;ID | 
|---|
| 144 | ;;6;IDREF | 
|---|
| 145 | ;;7;IDREFS | 
|---|
| 146 | ;;8;NOTATION | 
|---|
| 147 | ;;9;ENTITY | 
|---|
| 148 | ;;10;ENTITIES | 
|---|
| 149 | ;; | 
|---|
| 150 | ; Default modifiers | 
|---|
| 151 | ; Format=identifier;modifier | 
|---|
| 152 | MOD ;;1;#REQUIRED | 
|---|
| 153 | ;;2;#IMPLIED | 
|---|
| 154 | ;;3;#FIXED | 
|---|
| 155 | ;; | 
|---|
| 156 | ; Forward references | 
|---|
| 157 | ; Format=type;error #;type | 
|---|
| 158 | REF ;;49;UNP | 
|---|
| 159 | ;;46;NOT | 
|---|
| 160 | ;;26;ELE | 
|---|
| 161 | ;;47;ID | 
|---|
| 162 | ;; | 
|---|