Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: MXMLPRS1

MXMLPRS1.m

Go to the documentation of this file.
  1. MXMLPRS1 ;SAIC/DKM - XML Parser ;12/04/2002 15:55
  1. ;;7.3;TOOLKIT;**58,67**;Apr 25, 1995
  1. ;=================================================================
  1. ; Initialize tables
  1. INIT N X,Y,Z
  1. F X=0:1 S Y=$P($T(ENTITIES+X),";;",2,99) Q:'$L(Y) D
  1. .D SETENT^MXMLPRSE($P(Y,";"),$P(Y,";",2,99))
  1. F X=0:1 S Y=$P($T(DTDTAG+X),";;",2,99) Q:'$L(Y) D
  1. .S DTD($P(Y,";"))=$P(Y,";",2)
  1. F X=0:1 S Y=$P($T(TYPE+X),";;",2,99) Q:'$L(Y) D
  1. .S ^TMP(ID,$J,"TYP",$P(Y,";",2))=+Y
  1. F X=0:1 S Y=$P($T(MOD+X),";;",2,99) Q:'$L(Y) D
  1. .S ^TMP(ID,$J,"MOD",$P(Y,";",2))=+Y
  1. F X=0:1 S Y=$P($T(REF+X),";;",2,99) Q:'$L(Y) D
  1. .S ^TMP(ID,$J,"REF",$P(Y,";",2))=+Y
  1. F X=0:1 S Y=$P($T(CBKARGS+X),";;",2,99) Q:'$L(Y) D
  1. .S ^TMP(ID,$J,"CBK",$P(Y,";",2))=+Y
  1. F X=0:1 S Y=$P($T(PROLOG+X),";;",2,99) Q:'$L(Y) D
  1. .S Z=$P(Y,";"),^TMP(ID,$J,"ATT","?xml",Z)="1^"_$S('X:1,1:2)
  1. .F S Y=$P(Y,";",2,99) Q:'$L(Y) S ^TMP(ID,$J,"ATT","?xml",Z,$P(Y,";"))=""
  1. Q
  1. ; Search parse tree for child element (CHILD) under parent element
  1. ; (ELEMENT) starting at specified node (NODE).
  1. ; Returns next node # in parse tree or 0
  1. ; If validation is disabled, the function always returns 1.
  1. ; If parent element is marked as EMPTY, 0 is returned.
  1. ; If parent element is marked as ANY, 1 is returned.
  1. ISCHILD(ELEMENT,CHILD,NODE) ;
  1. N TRN
  1. S TRN=+$G(^TMP(ID,$J,"ELE",ELEMENT),2)
  1. Q $S(OPTION'["V"!'NODE:1,TRN=1:CHILD="*",TRN=2:1,1:$$IC(NODE))
  1. IC(NODE) N X,Y
  1. S X=+$G(^TMP(ID,$J,"ELE",ELEMENT,NODE,CHILD)),Y=0
  1. I 'X D
  1. .F S Y=$O(^TMP(ID,$J,"ELE",ELEMENT,NODE,Y)) Q:'Y D Q:X
  1. ..S:'$D(TRN(NODE,Y)) TRN(NODE,Y)="",X=$$IC(Y)
  1. Q X
  1. ; Check attribute value for validity
  1. CHKVAL(ENAME,ANAME,VALUE) ;
  1. N TYPE,X,Y,Z
  1. Q:'$L(VALUE)
  1. I $D(^TMP(ID,$J,"ATT",ENAME,ANAME))>1 D:'$D(^(ANAME,VALUE)) ERROR(38,VALUE) Q
  1. S TYPE=+$G(^TMP(ID,$J,"ATT",ENAME,ANAME))
  1. Q:'TYPE
  1. I TYPE=5 D Q ; ID type
  1. .I '$$ISNAME(VALUE) D ERROR(38,VALUE) Q
  1. .I '$D(^TMP(ID,$J,"ID",VALUE)) D
  1. ..S ^(VALUE)=""
  1. ..D NOFWD("ID",VALUE)
  1. .E D ERROR(28,VALUE)
  1. I TYPE=9!(TYPE=10) D Q ; ENTITY/ENTITIES type
  1. .S X=$S(TYPE=9:" ",1:" ")
  1. .F Z=1:1:$L(VALUE,X) D FWD("UNP",$P(VALUE,X,Z))
  1. I TYPE=3!(TYPE=4) D Q ; NMTOKEN/NMTOKENS type
  1. .S X=$S(TYPE=3:" ",1:" ")
  1. .F Z=1:1:$L(VALUE,X) D
  1. ..S Y=$P(VALUE,X,Z)
  1. ..D:'$$ISNMTKN(Y) ERROR(38,Y)
  1. I TYPE=6!(TYPE=7) D Q ; IDREF/IDREFS type
  1. .S X=$S(TYPE=6:" ",1:" ")
  1. .F Z=1:1:$L(VALUE,X) D
  1. ..S Y=$P(VALUE,X,Z)
  1. ..I '$$ISNAME(Y) D ERROR(38,Y) Q
  1. ..D FWD("ID",Y)
  1. Q
  1. ; Return true if valid name
  1. ISNAME(VALUE) ;
  1. Q VALUE?1(1A,1"_",1":").(1AN,1".",1"-",1"_",1":")
  1. ; Return true if valid name token
  1. ISNMTKN(VALUE) ;
  1. Q VALUE?1.(1AN,1".",1"-",1"_",1":")
  1. ; Log a forward reference
  1. FWD(TYPE,VALUE) ;
  1. Q:'$L(VALUE)
  1. Q:$D(^TMP(ID,$J,TYPE,VALUE))
  1. N Z
  1. S Z=$O(^TMP(ID,$J,"REF",TYPE,VALUE,""),-1)+1
  1. M ^(Z)=ERR
  1. Q
  1. ; Resolve forward reference
  1. NOFWD(TYPE,VALUE) ;
  1. K ^TMP(ID,$J,"REF",TYPE,VALUE)
  1. Q
  1. ; Signal unresolved references
  1. UNRESLV N X,Y,Z,E
  1. F X=1:1:LVL D
  1. .K ERR
  1. .M ERR=LVL(X)
  1. .D ERROR(8,LVL(X))
  1. S X=""
  1. F S X=$O(^TMP(ID,$J,"REF",X)),Y="" Q:'$L(X) D ; Look for IDREF w/o corresponding ID value
  1. .S E=^(X)
  1. .F S Y=$O(^TMP(ID,$J,"REF",X,Y)),Z=0 Q:'$L(Y) D
  1. ..F S Z=$O(^TMP(ID,$J,"REF",X,Y,Z)) Q:'Z D
  1. ...K ERR
  1. ...M ERR=^(Z)
  1. ...D ERROR(E,Y)
  1. Q
  1. ; Log error
  1. ERROR(X,Y) D ERROR^MXMLPRSE(.X,.Y) Q
  1. ; Predefined general entities
  1. ; Format=entity name;entity value
  1. ENTITIES ;;amp;&
  1. ;;lt;<
  1. ;;gt;>
  1. ;;quot;"
  1. ;;apos;'
  1. ;;
  1. ; Callback events
  1. ; Format=#args;event type
  1. CBKARGS ;;0;STARTDOCUMENT
  1. ;;0;ENDDOCUMENT
  1. ;;3;DOCTYPE
  1. ;;1;CHARACTERS
  1. ;;2;STARTELEMENT
  1. ;;1;ENDELEMENT
  1. ;;3;NOTATION
  1. ;;2;PI
  1. ;;1;COMMENT
  1. ;;3;EXTERNAL
  1. ;;1;ERROR
  1. ;;
  1. ; Prolog attributes
  1. ; Format=attribute name;val1;val2;...;valn
  1. PROLOG ;;version;1.0
  1. ;;encoding;UTF-8;utf-8
  1. ;;standalone;no;yes
  1. ;;
  1. ; Recognized DTD tags
  1. ; Format=tag name;state
  1. DTDTAG ;;ENTITY;20
  1. ;;ELEMENT;30
  1. ;;ATTLIST;40
  1. ;;NOTATION;50
  1. ;;[;60
  1. ;;
  1. ; Attribute types
  1. ; Format=identifier;type
  1. TYPE ;;1;(
  1. ;;2;CDATA
  1. ;;3;NMTOKEN
  1. ;;4;NMTOKENS
  1. ;;5;ID
  1. ;;6;IDREF
  1. ;;7;IDREFS
  1. ;;8;NOTATION
  1. ;;9;ENTITY
  1. ;;10;ENTITIES
  1. ;;
  1. ; Default modifiers
  1. ; Format=identifier;modifier
  1. MOD ;;1;#REQUIRED
  1. ;;2;#IMPLIED
  1. ;;3;#FIXED
  1. ;;
  1. ; Forward references
  1. ; Format=type;error #;type
  1. REF ;;49;UNP
  1. ;;46;NOT
  1. ;;26;ELE
  1. ;;47;ID
  1. ;;