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 | ;;
|
---|