The second form operates on an XML dataset, parsing the XML data and creating a result set using the result parameter, one output record per input. The expectation is that each row of data contains a complete block of XML. If the result names a RECORD structure, then this form of PARSE operates like the TABLE function to generate the result set.
If the result names a TRANSFORM function, then the transform generates the result set. The TRANSFORM function must take at least one parameter: a LEFT record of the same format as the dataset. The format of the resulting record set does not need to be the same as the input.
NOTE: XML reading and parsing can consume a large amount of memory, depending on the usage. In particular, if the specified xpath matches a very large amount of data, then a large data structure will be provided to the transform. Therefore, the more you match, the more resources you consume per match. For example, if you have a very large document and you match an element near the root that virtually encompasses the whole thing, then the whole thing will be constructed as a referenceable structure that the ECL can get at.
Example:
linerec := { STRING line }; in1 := DATASET([{ '<ENTITY eid="P101" type="PERSON" subtype="MILITARY">' + ' <ATTRIBUTE name="fullname">JOHN SMITH</ATTRIBUTE>' + ' <ATTRIBUTE name="honorific">Mr.</ATTRIBUTE>' + ' <ATTRIBUTEGRP descriptor="passport">' + ' <ATTRIBUTE name="idNumber">W12468</ATTRIBUTE>' + ' <ATTRIBUTE name="idType">pp</ATTRIBUTE>' + ' <ATTRIBUTE name="issuingAuthority">JAPAN PASSPORT AUTHORITY</ATTRIBUTE>' + ' <ATTRIBUTE name="country" value="L202"/>' + ' <ATTRIBUTE name="age" value="19"/>' + ' </ATTRIBUTEGRP>' + '</ENTITY>'}], linerec); passportRec := RECORD STRING id; STRING idType; STRING issuer; STRING country; INTEGER age; END; outrec := RECORD STRING id; UNICODE fullname; UNICODE title; passportRec passport; STRING line; END; outrec t(lineRec L) := TRANSFORM SELF.id := XMLTEXT('@eid'); SELF.fullname := XMLUNICODE('ATTRIBUTE[@name="fullname"]'); SELF.title := XMLUNICODE('ATTRIBUTE[@name="honorific"]'); SELF.passport.id := XMLTEXT('ATTRIBUTEGRP[@descriptor="passport"]' + '/ATTRIBUTE[@name="idNumber"]'); SELF.passport.idType := XMLTEXT('ATTRIBUTEGRP[@descriptor="passport"]' + '/ATTRIBUTE[@name="idType"]'); SELF.passport.issuer := XMLTEXT('ATTRIBUTEGRP[@descriptor="passport"]' + '/ATTRIBUTE[@name="issuingAuthority"]'); SELF.passport.country := XMLTEXT('ATTRIBUTEGRP[@descriptor="passport"]' + '/ATTRIBUTE[@name="country"]/@value'); SELF.passport.age := (INTEGER)XMLTEXT('ATTRIBUTEGRP[@descriptor="passport"]' + '/ATTRIBUTE[@name="age"]/@value'); SELF := L; END; textout := PARSE(in1, line, t(LEFT), XML('/ENTITY[@type="PERSON"]')); OUTPUT(textout);
See Also: DATASET, OUTPUT, XMLENCODE, XMLDECODE, REGEXFIND, REGEXREPLACE, DEFINE