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

HDISVM01.m

Go to the documentation of this file.
  1. HDISVM01 ;BPFO/JRP - PARSE XML DOCUMENT USING SAX;12/20/2004
  1. ;;1.0;HEALTH DATA & INFORMATICS;;Feb 22, 2005
  1. ;
  1. SAX(XMLARR,PRSARR) ;Parse XML document using SAX interface
  1. ; Input: XMLARR - Global array containing XML document (closed root)
  1. ; PRSARR - Array to output parsed XML document (closed root)
  1. ;Output: None
  1. ; @PRSARR@("ESUBS",ESN) = Element name
  1. ; @PRSARR@("EINDX",ElementName) = Subscript number (ESN)
  1. ; @PRSARR@("ASUBS",ESN,ASN) = Attribute name
  1. ; @PRSARR@("AINDX",ESN,AttributeName) = Subscript number (ASN)
  1. ; @PRSARR@("DATA",ESN,Repetition,"V") = Value of element
  1. ; @PRSARR@("DATA",ESN,Repetition,"A",ASN) = Value of attribute
  1. ; @PRSARR@("DATA",ESN1,Rep1,ESN2,Rep2,"V") = Value of child
  1. ; element
  1. ; @PRSARR@("DATA",ESN1,Rep1,ESN2,Rep2,"A",ASN) = Value of child
  1. ; attribute
  1. ; Notes : XMLARR must be a global array (i.e. no local arrays)
  1. ; : PRSARR is initialized (i.e KILLed) on input
  1. Q:$G(XMLARR)=""
  1. Q:'$D(@XMLARR)
  1. Q:$G(PRSARR)=""
  1. N HDICBK,SUBNUM,TAGNAME
  1. N ESUBS,EINDX,ASUBS,AINDX,DATA
  1. S ESUBS=$NA(@PRSARR@("ESUBS"))
  1. S EINDX=$NA(@PRSARR@("EINDX"))
  1. S ASUBS=$NA(@PRSARR@("ASUBS"))
  1. S AINDX=$NA(@PRSARR@("AINDX"))
  1. S DATA=$NA(@PRSARR@("DATA"))
  1. ;Set callbacks
  1. S HDICBK("STARTDOCUMENT")="STRTDOC^HDISVM01"
  1. S HDICBK("ENDDOCUMENT")="ENDDOC^HDISVM01"
  1. S HDICBK("DOCTYPE")="DOCTYPE^HDISVM01"
  1. S HDICBK("STARTELEMENT")="STRTLMNT^HDISVM01"
  1. S HDICBK("ENDELEMENT")="ENDLMNT^HDISVM01"
  1. S HDICBK("CHARACTERS")="CHARS^HDISVM01"
  1. S HDICBK("PI")="PI^HDISVM01"
  1. S HDICBK("EXTERNAL")="EXTERN^HDISVM01"
  1. S HDICBK("NOTATION")="NOTATION^HDISVM01"
  1. S HDICBK("COMMENT")="COMMENT^HDISVM01"
  1. S HDICBK("ERROR")="ERROR^HDISVM01"
  1. ;Parse XML document using SAX
  1. K @PRSARR
  1. D EN^MXMLPRSE(XMLARR,.HDICBK,"")
  1. Q
  1. ;
  1. STRTDOC ;Start document
  1. Q
  1. ;
  1. ENDDOC ;End document
  1. Q
  1. ;
  1. DOCTYPE(ROOT,PUBID,SYSID) ;DOCTYPE declaration
  1. Q
  1. ;
  1. STRTLMNT(NAME,ATTRLIST) ;Start element
  1. N ESN,REP,ATTR,ASN,TMPREF
  1. ;Determine element subscript number
  1. S ESN=+$G(@EINDX@(NAME))
  1. I 'ESN D
  1. .S ESN=1+$O(@ESUBS@(""),-1)
  1. .S @ESUBS@(ESN)=NAME
  1. .S @EINDX@(NAME)=ESN
  1. ;Determine repetition number
  1. S REP=1+$O(@DATA@(ESN,""),-1)
  1. ;Add element subscript number and repetition number to output array
  1. S TMPREF=$$OREF^DILF(DATA)
  1. S TMPREF=TMPREF_ESN_","_REP_","
  1. S DATA=$$CREF^DILF(TMPREF)
  1. ;Store attributes
  1. S ATTR=""
  1. F S ATTR=$O(ATTRLIST(ATTR)) Q:ATTR="" D
  1. .;Get attribute subscript number
  1. .S ASN=+$G(@AINDX@(ESN,ATTR))
  1. .I 'ASN D
  1. ..S ASN=1+$O(@ASUBS@(""),-1)
  1. ..S @ASUBS@(ESN,ASN)=ATTR
  1. ..S @AINDX@(ESN,ATTR)=ASN
  1. .;Store value
  1. .S @DATA@("A",ASN)=ATTRLIST(ATTR)
  1. Q
  1. ;
  1. ENDLMNT(NAME) ;End element
  1. N TMPREF,SUBCNT,SUBCHK
  1. ;Remove element subscript number and repition number from output array
  1. S TMPREF=$$OREF^DILF(DATA)
  1. S SUBCNT=$L(TMPREF,",")
  1. S SUBCHK=SUBCNT-3
  1. I SUBCHK>0 S TMPREF=$P(TMPREF,",",1,SUBCHK)_","
  1. I SUBCHK<1 S TMPREF=$P(TMPREF,"(",1)_"("
  1. S DATA=$$CREF^DILF(TMPREF)
  1. Q
  1. ;
  1. CHARS(TEXT) ;Non-markup content
  1. ;Store element value
  1. S @DATA@("V")=TEXT
  1. Q
  1. ;
  1. PI(TARGET,TEXT) ;Processing instruction
  1. Q
  1. ;
  1. EXTERN(SYSID,PUBID,GLOBAL) ;External entity reference
  1. Q
  1. ;
  1. NOTATION(NAME,SYSID,PUBID) ;Notation declaration
  1. Q
  1. ;
  1. COMMENT(TEXT) ;Comment
  1. Q
  1. ;
  1. ERROR(ERR) ;Error
  1. Q
  1. ;
  1. UNESC(TEXT) ;Convert escaped characters
  1. ;Assumes TEXT is not corrupt
  1. N ESCBEG,ESCEND,ESCTXT,ESCCHAR,OUTPUT
  1. S TEXT=$G(TEXT)
  1. I TEXT="" Q TEXT
  1. I TEXT'["&" Q TEXT
  1. ;Do conversion
  1. S OUTPUT=""
  1. F Q:TEXT'["&" D
  1. .;Find escaped character
  1. .S ESCBEG=$F(TEXT,"&")
  1. .S ESCEND=$F(TEXT,";",ESCBEG)
  1. .S ESCTXT=$E(TEXT,ESCBEG,ESCEND-2)
  1. .;Convert escaped character
  1. .S ESCCHAR=""
  1. .I ESCTXT="amp" S ESCCHAR="&"
  1. .I ESCTXT="lt" S ESCCHAR="<"
  1. .I ESCTXT="gt" S ESCCHAR=">"
  1. .I ESCTXT="apos" S ESCCHAR="'"
  1. .I ESCTXT="quot" S ESCCHAR=$C(34)
  1. .;Replace escaped character with actual character
  1. .S OUTPUT=OUTPUT_$E(TEXT,1,ESCBEG-2)_ESCCHAR
  1. .;Continue processing rest of string
  1. .S TEXT=$E(TEXT,ESCEND,$L(TEXT))
  1. ;Add on remainder of text
  1. S OUTPUT=OUTPUT_TEXT
  1. Q OUTPUT