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

EDPXML.m

Go to the documentation of this file.
  1. EDPXML ;SLC/KCM - XML Array Utilities ;4/25/12 12:51pm
  1. ;;2.0;EMERGENCY DEPARTMENT;;May 2, 2012;Build 103
  1. ;
  1. Q
  1. TOARR(SRC,DEST,WAITPAST) ; convert XML in global reference to global/local array
  1. ; SRC(n) contains the lines of an XML document
  1. ; DEST is return array, DEST(ELE,n,ELE,n....ATTR)= attribute value
  1. ; DEST(ELE,n,ELE,n,...0)=element text
  1. ; WAITPAST is node to wait for before adding nodes to DEST
  1. ;
  1. K ^TMP($J,"EDPXMLSRC") M ^TMP($J,"EDPXMLSRC")=SRC
  1. N STACK,CALLBACK,REF,CREF,WAITING
  1. S STACK=0 S WAITING=($G(WAITPAST)'="")
  1. S CALLBACK("STARTELEMENT")="STARTEL^EDPXML"
  1. S CALLBACK("ENDELEMENT")="ENDEL^EDPXML"
  1. S CALLBACK("CHARACTERS")="CHARS^EDPXML"
  1. D EN^MXMLPRSE($NA(^TMP($J,"EDPXMLSRC")),.CALLBACK,"W")
  1. K ^TMP($J,"EDPXMLSRC")
  1. Q
  1. STARTEL(ELEMENT,ATTR) ; start element
  1. I WAITING,ELEMENT=WAITPAST S WAITING=0 Q
  1. Q:WAITING
  1. N I,X
  1. ; new stack level, remove former descendants
  1. S STACK=STACK+1 K STACK(STACK+1)
  1. S STACK(STACK,ELEMENT)=$G(STACK(STACK,ELEMENT))+1
  1. S REF(STACK)=""""_ELEMENT_""","_STACK(STACK,ELEMENT)_","
  1. S REF="DEST(" S I=0 F S I=$O(REF(I)) Q:'I Q:I>STACK S REF=REF_REF(I)
  1. I $D(ATTR) S X="" F S X=$O(ATTR(X)) Q:X="" S @(REF_""""_X_""")")=ATTR(X)
  1. S CREF=$E(REF,1,$L(REF)-1)_",0)"
  1. Q
  1. ENDEL(ELEMENT) ; end element
  1. Q:WAITING
  1. S STACK=STACK-1
  1. Q
  1. CHARS(TXT) ; character data
  1. Q:WAITING Q:'$D(CREF) Q:TXT?.C Q:TXT?." "
  1. S @CREF=TXT
  1. Q
  1. ;
  1. TOXML(SOURCE,XMLDOC) ; convert array variable to XML document
  1. ; SOURCE is array to convert, SOURCE(ELE,n,ELE,n,...,ATTR)=attribuite value
  1. ; SOURCE(ELE,n,ELE,n,...,0)=element text
  1. ; SOURCE(ELE,n,ELE,n,...,#)=XML
  1. ; XMLDOC(n) contains the lines of the output XML document
  1. N LINE,TOP
  1. S LINE=0
  1. S TOP="" F S TOP=$O(SOURCE(TOP)) Q:TOP="" D BLDELEM("SOURCE",TOP)
  1. Q
  1. BLDELEM(REF,ELEMENT) ; Build an XML element (attributes & value)
  1. N SEQ,SUB,VALUE,ATTRIB,LLINE,CHILDREN
  1. S SEQ=0 F S SEQ=$O(@REF@(ELEMENT,SEQ)) Q:'SEQ D
  1. . S LINE=LINE+1,LLINE=LINE,VALUE="",ATTRIB="",CHILDREN=0
  1. . S SUB="" F S SUB=$O(@REF@(ELEMENT,SEQ,SUB)) Q:SUB="" D
  1. . . I $D(@REF@(ELEMENT,SEQ,SUB))=1 D
  1. . . . I +SUB S CHILDREN=1,LINE=LINE+1,XMLDOC(LINE)=@REF@(ELEMENT,SEQ,SUB) Q
  1. . . . I SUB=0 S VALUE=@REF@(ELEMENT,SEQ,SUB) Q
  1. . . . I 'SUB S ATTRIB=ATTRIB_" "_SUB_"="""_@REF@(ELEMENT,SEQ,SUB)_"""" Q
  1. . . I $D(@REF@(ELEMENT,SEQ,SUB))>1 D
  1. . . . S CHILDREN=1
  1. . . . D BLDELEM($NA(@REF@(ELEMENT,SEQ)),SUB)
  1. . S XMLDOC(LLINE)="<"_ELEMENT_ATTRIB_$S(CHILDREN!$L(VALUE):">",1:"/>")_$$ESC^EDPX(VALUE)
  1. . I 'CHILDREN,$L(VALUE) S XMLDOC(LLINE)=XMLDOC(LLINE)_"</"_ELEMENT_">"
  1. . I CHILDREN S LINE=LINE+1,XMLDOC(LINE)="</"_ELEMENT_">"
  1. Q
  1. ;
  1. TOXMLG(SOURCE,XMLDOC) ; convert array variable to XML document
  1. ; SOURCE is array to convert, SOURCE(ELE,n,ELE,n,...,ATTR)=attribuite value
  1. ; SOURCE(ELE,n,ELE,n,...,0)=element text
  1. ; SOURCE(ELE,n,ELE,n,...,#)=XML
  1. ; XMLDOC(n) contains the lines of the output XML document
  1. N LINE,TOP
  1. S LINE=0
  1. S TOP="" F S TOP=$O(@SOURCE@(TOP)) Q:TOP="" D BLDELEMG(SOURCE,TOP)
  1. Q
  1. BLDELEMG(REF,ELEMENT) ; Build an XML element (attributes & value)
  1. N SEQ,SUB,VALUE,ATTRIB,LLINE,CHILDREN
  1. S SEQ=0 F S SEQ=$O(@REF@(ELEMENT,SEQ)) Q:'SEQ D
  1. . S LINE=LINE+1,LLINE=LINE,VALUE="",ATTRIB="",CHILDREN=0
  1. . S SUB="" F S SUB=$O(@REF@(ELEMENT,SEQ,SUB)) Q:SUB="" D
  1. . . I $D(@REF@(ELEMENT,SEQ,SUB))=1 D
  1. . . . I +SUB S CHILDREN=1,LINE=LINE+1,@XMLDOC@(LINE)=@REF@(ELEMENT,SEQ,SUB) Q
  1. . . . I SUB=0 S VALUE=@REF@(ELEMENT,SEQ,SUB) Q
  1. . . . I 'SUB S ATTRIB=ATTRIB_" "_SUB_"="""_@REF@(ELEMENT,SEQ,SUB)_"""" Q
  1. . . I $D(@REF@(ELEMENT,SEQ,SUB))>1 D
  1. . . . S CHILDREN=1
  1. . . . D BLDELEMG($NA(@REF@(ELEMENT,SEQ)),SUB)
  1. . S @XMLDOC@(LLINE)="<"_ELEMENT_ATTRIB_$S(CHILDREN!$L(VALUE):">",1:"/>")_$$ESC^EDPX(VALUE)
  1. . I 'CHILDREN,$L(VALUE) S @XMLDOC@(LLINE)=@XMLDOC@(LLINE)_"</"_ELEMENT_">"
  1. . I CHILDREN S LINE=LINE+1,@XMLDOC@(LINE)="</"_ELEMENT_">"
  1. Q
  1. ;
  1. ; bwf: 12/19/2011 - commenting test logic for the time being.
  1. ;
  1. ;TESTXML ;
  1. ;N XMLIN,SKIP
  1. ;M XMLIN=^KCM("VitalRead") S SKIP="data"
  1. ;D TOARR(.XMLIN,.EDPARR,SKIP) ZW EDPARR
  1. ;Q
  1. ;TESTGBL ;
  1. ;D TOXML(.EDPARR,.XMLOUT) ZW XMLOUT
  1. ;Q