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"]'));
See Also: DATASET, OUTPUT, XMLENCODE, XMLDECODE, REGEXFIND, REGEXREPLACE, DEFINE