PsoftToXML Application Class - Convert PeopleSoft Object to XML
By Chris Malek | Fri, Oct 27, 2017
I want to release some code that may be helpful for PeopleSoft web service developers providing PeopleSoft data to 3rd parties. This would be a replacement for using Rowset-based messages.
Introduction
If you provide XML web services from PeopleSoft to other systems, one of the major decisions you have to make is to how to encode the XML. You have a few options to return data to the client.
- Use the PeopleCode
XML
class to create some bespoke XML document.- If your client needs a specific XML document structure then you will have use the
XML
application class that returns the specific structure they require.
- If your client needs a specific XML document structure then you will have use the
- Use Rowset-based message objects and let PeopleSoft handle the encoding.
- If you are using Rowset-based you end up returning all or some of the fields. The XML structure is tightly coupled to the record structures. If your client can handle the PeopleSoft data structure then Rowset-based messages are a good solution.
I have used both of these methods for many years. They both have their place.
I developed some code that will serve a similar purpose to the rowset-based messages. It is a “PeopleSoft Object to XML encoder” called psoftToXML
. It gives you some flexibility over rowset-based message objects in organizing the output. It also allows you to provide dynamic content where a rowset-based message is tied to a specific record. So if you have a common piece of handler code serving different data based on the inputs this could be helpful.
I wrote this because I was providing a bunch of data to a 3rd party system and that system could handle the raw PeopleSoft data structure. I did not want to maintain a bunch of rowset-based messages every time I wanted to add a new table to the export.
Class Signature and Import
First let’s just take a quick look at the class definition. There are a few methods to take note of.
RowsetToXML
- Encodes a rowset object and all it’s child rows and rowsets into XML under some XMLparentNode
.RowToXML
- Encodes a row object and all it’s child records into XML under some XMLparentNode
.RecordToXML
- Encodes a record object and all it’s fileds into XML under some XMLparentNode
.
class psoftToXML
method RowsetToXML(&parentNode As XmlNode, &rowSetIn As Rowset) Returns XmlNode;
method RecordToXML(&parentNode As XmlNode, &recordIn As Record) Returns XmlNode;
method FieldToXML(&ParentNode As XmlNode, &fieldIn As Field) Returns XmlNode;
method RowToXML(&ParentNode As XmlNode, &rowIn As Row) Returns XmlNode;
method psoftToXML();
property array of string fieldsToSkip;
end-class;
You import the class like this:
import CHG_XML:psoftToXML;
Example Usage
Let’s take a look at some example use cases and the output that is generated. These PeopleCode examples are snippets of a web service handler that is accepting input, pulling data from the database and then returning the PeopleSoft record/rowset objects. If you need a full example of the web service handler please see A Complete PeopleSoft REST Web Service Example.
Example 1 - Return Person Rowset
In this example, we will encode a rowset with just the PERSON
record filled for one person. The code sets up a base XML document then uses the RowsetToXML
to append the encoded rowset to the XML.
&response = CreateMessage(Operation.CHG_PERSON_GET, %IntBroker_Response);
Local CHG_XML:psoftToXML &p2XML = create CHG_XML:psoftToXML();
Local XmlDoc &xmlout;
Local XmlNode &childNode;
&xmlout = CreateXmlDoc("<?xml version='1.0'?><response/>");
Local Rowset &rsPerson = CreateRowset(Record.PERSON);
&rsPerson.Fill("WHERE EMPLID = :1 ", ¶mEMPLID);
&childNode = &p2XML.RowsetToXML(&xmlout.DocumentElement, &rsPerson);
&response.SetXmlDoc(&xmlout);
That one call to RowsetToXML
outputs the following XML which is an XML encoded representation of the rowset object. It includes all rows, records and fields. In this case there is just one row and one record.
<?xml version="1.0"?>
<response>
<PERSON PSOBJECTTYPE="ROWSET">
<ROW PSOBJECTTYPE="ROW" RowNumber="1">
<PERSON PSOBJECTTYPE="RECORD">
<EMPLID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">L00013</EMPLID>
<BIRTHDATE PSFIELDTYPE="DATE" PSOBJECTTYPE="FIELD">1950-04-01</BIRTHDATE>
<BIRTHPLACE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<BIRTHCOUNTRY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">USA</BIRTHCOUNTRY>
<BIRTHSTATE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<DT_OF_DEATH PSFIELDTYPE="DATE" PSOBJECTTYPE="FIELD"/>
<LAST_CHILD_UPDDTM PSFIELDTYPE="DATETIME" PSOBJECTTYPE="FIELD">2009-04-14-10.26.08.000000</LAST_CHILD_UPDDTM>
</PERSON>
</ROW>
</PERSON>
</response>
Example 2 - Encode Person Record
You can also just include one record object. Here is a sample PeopleCode call for a person object.
Local Record &recPerson = CreateRecord(Record.PERSON);
&recPerson.EMPLID.Value = ¶mEMPLID;
&recPerson.SelectByKey();
&childNode = &p2XML.RecordToXML(&xmlout.DocumentElement, &recPerson);
The output is the following.
<?xml version="1.0"?>
<response>
<PERSON PSOBJECTTYPE="RECORD">
<EMPLID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">L00013</EMPLID>
<BIRTHDATE PSFIELDTYPE="DATE" PSOBJECTTYPE="FIELD">1950-04-01</BIRTHDATE>
<BIRTHPLACE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<BIRTHCOUNTRY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">USA</BIRTHCOUNTRY>
<BIRTHSTATE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<DT_OF_DEATH PSFIELDTYPE="DATE" PSOBJECTTYPE="FIELD"/>
<LAST_CHILD_UPDDTM PSFIELDTYPE="DATETIME" PSOBJECTTYPE="FIELD">2009-04-14-10.26.08.000000</LAST_CHILD_UPDDTM>
</PERSON>
</response>
Example 3 - Nested Rowsets
The RowsetToXML
method will also find any child rowsets and encode those recursively. In this example, we create a nested hierarchy in memory of the PERSON
-> ADDRESSES
hierarchy and fill the person data and all addresses for an EMPLID. Any number of child rowsets can be added.
Local Rowset &rsPerson2 = CreateRowset(Record.PERSON, CreateRowset(Record.ADDRESSES));
&rsPerson2.Fill("WHERE EMPLID = :1 ", ¶mEMPLID);
&rsPerson2.GetRow(1).GetRowset(Scroll.ADDRESSES).Fill("WHERE EMPLID = :1 ", ¶mEMPLID);
&childNode = &p2XML.RowsetToXML(&xmlout.DocumentElement, &rsPerson2);
The output looks like this:
<?xml version="1.0"?>
<response>
<PERSON PSOBJECTTYPE="ROWSET">
<ROW PSOBJECTTYPE="ROW" RowNumber="1">
<PERSON PSOBJECTTYPE="RECORD">
<EMPLID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">L00013</EMPLID>
<BIRTHDATE PSFIELDTYPE="DATE" PSOBJECTTYPE="FIELD">1950-04-01</BIRTHDATE>
<BIRTHPLACE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<BIRTHCOUNTRY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">USA</BIRTHCOUNTRY>
<BIRTHSTATE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<DT_OF_DEATH PSFIELDTYPE="DATE" PSOBJECTTYPE="FIELD"/>
<LAST_CHILD_UPDDTM PSFIELDTYPE="DATETIME" PSOBJECTTYPE="FIELD">2009-04-14-10.26.08.000000</LAST_CHILD_UPDDTM>
</PERSON>
<ADDRESSES PSOBJECTTYPE="ROWSET">
<ROW PSOBJECTTYPE="ROW" RowNumber="1">
<ADDRESSES PSOBJECTTYPE="RECORD">
<EMPLID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">L00013</EMPLID>
<ADDRESS_TYPE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">HOME</ADDRESS_TYPE>
<EFFDT PSFIELDTYPE="DATE" PSOBJECTTYPE="FIELD">1995-12-01</EFFDT>
<EFF_STATUS LongTranslateValue="Active" PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">A</EFF_STATUS>
<COUNTRY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">USA</COUNTRY>
<ADDRESS1 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">9706 Peridot Drive</ADDRESS1>
<ADDRESS2 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS3 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS4 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<CITY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">Reston</CITY>
<NUM1 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<NUM2 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<HOUSE_TYPE LongTranslateValue="" PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDR_FIELD1 LongTranslateValue="" PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDR_FIELD2 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDR_FIELD3 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<COUNTY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">USA</COUNTY>
<STATE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">VA</STATE>
<POSTAL PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">20190</POSTAL>
<GEO_CODE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<IN_CITY_LIMIT PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS1_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS2_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS3_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<CITY_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<REG_REGION PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<LASTUPDDTTM PSFIELDTYPE="DATETIME" PSOBJECTTYPE="FIELD">1900-01-01-00.00.00.000000</LASTUPDDTTM>
<LASTUPDOPRID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
</ADDRESSES>
</ROW>
<ROW PSOBJECTTYPE="ROW" RowNumber="2">
<ADDRESSES PSOBJECTTYPE="RECORD">
<EMPLID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">L00013</EMPLID>
<ADDRESS_TYPE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">HOME</ADDRESS_TYPE>
<EFFDT PSFIELDTYPE="DATE" PSOBJECTTYPE="FIELD">1997-10-01</EFFDT>
<EFF_STATUS LongTranslateValue="Active" PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">A</EFF_STATUS>
<COUNTRY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">USA</COUNTRY>
<ADDRESS1 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">9706 Peridot Drive</ADDRESS1>
<ADDRESS2 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS3 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS4 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<CITY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">Reston</CITY>
<NUM1 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<NUM2 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<HOUSE_TYPE LongTranslateValue="" PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDR_FIELD1 LongTranslateValue="" PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDR_FIELD2 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDR_FIELD3 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<COUNTY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">USA</COUNTY>
<STATE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">VA</STATE>
<POSTAL PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">20190</POSTAL>
<GEO_CODE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<IN_CITY_LIMIT PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS1_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS2_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS3_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<CITY_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<REG_REGION PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<LASTUPDDTTM PSFIELDTYPE="DATETIME" PSOBJECTTYPE="FIELD">1900-01-01-00.00.00.000000</LASTUPDDTTM>
<LASTUPDOPRID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
</ADDRESSES>
</ROW>
<ROW PSOBJECTTYPE="ROW" RowNumber="3">
<ADDRESSES PSOBJECTTYPE="RECORD">
<EMPLID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">L00013</EMPLID>
<ADDRESS_TYPE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">HOME</ADDRESS_TYPE>
<EFFDT PSFIELDTYPE="DATE" PSOBJECTTYPE="FIELD">2000-01-16</EFFDT>
<EFF_STATUS LongTranslateValue="Active" PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">A</EFF_STATUS>
<COUNTRY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">USA</COUNTRY>
<ADDRESS1 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">9706 Peridot Drive</ADDRESS1>
<ADDRESS2 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS3 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS4 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<CITY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">Reston</CITY>
<NUM1 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<NUM2 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<HOUSE_TYPE LongTranslateValue="" PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDR_FIELD1 LongTranslateValue="" PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDR_FIELD2 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDR_FIELD3 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<COUNTY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">USA</COUNTY>
<STATE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">VA</STATE>
<POSTAL PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">20190</POSTAL>
<GEO_CODE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<IN_CITY_LIMIT PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS1_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS2_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS3_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<CITY_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<REG_REGION PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<LASTUPDDTTM PSFIELDTYPE="DATETIME" PSOBJECTTYPE="FIELD">1900-01-01-00.00.00.000000</LASTUPDDTTM>
<LASTUPDOPRID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
</ADDRESSES>
</ROW>
<ROW PSOBJECTTYPE="ROW" RowNumber="4">
<ADDRESSES PSOBJECTTYPE="RECORD">
<EMPLID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">L00013</EMPLID>
<ADDRESS_TYPE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">HOME</ADDRESS_TYPE>
<EFFDT PSFIELDTYPE="DATE" PSOBJECTTYPE="FIELD">2009-01-01</EFFDT>
<EFF_STATUS LongTranslateValue="Active" PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">A</EFF_STATUS>
<COUNTRY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">USA</COUNTRY>
<ADDRESS1 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">9706 Peridot Drive</ADDRESS1>
<ADDRESS2 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS3 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS4 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<CITY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">Reston</CITY>
<NUM1 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<NUM2 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<HOUSE_TYPE LongTranslateValue="" PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDR_FIELD1 LongTranslateValue="" PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDR_FIELD2 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDR_FIELD3 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<COUNTY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">USA</COUNTY>
<STATE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">VA</STATE>
<POSTAL PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">20190</POSTAL>
<GEO_CODE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<IN_CITY_LIMIT PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS1_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS2_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS3_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<CITY_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<REG_REGION PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<LASTUPDDTTM PSFIELDTYPE="DATETIME" PSOBJECTTYPE="FIELD">2009-04-14-10.26.03.000000</LASTUPDDTTM>
<LASTUPDOPRID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">SMPLFED</LASTUPDOPRID>
</ADDRESSES>
</ROW>
<ROW PSOBJECTTYPE="ROW" RowNumber="5">
<ADDRESSES PSOBJECTTYPE="RECORD">
<EMPLID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">L00013</EMPLID>
<ADDRESS_TYPE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">MAIL</ADDRESS_TYPE>
<EFFDT PSFIELDTYPE="DATE" PSOBJECTTYPE="FIELD">2000-01-16</EFFDT>
<EFF_STATUS LongTranslateValue="Active" PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">A</EFF_STATUS>
<COUNTRY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">USA</COUNTRY>
<ADDRESS1 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">ADDRESS1</ADDRESS1>
<ADDRESS2 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">ADDRESS2</ADDRESS2>
<ADDRESS3 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">ADDRESS3</ADDRESS3>
<ADDRESS4 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">ADDRESS4</ADDRESS4>
<CITY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<NUM1 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<NUM2 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<HOUSE_TYPE LongTranslateValue="" PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDR_FIELD1 LongTranslateValue="" PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDR_FIELD2 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDR_FIELD3 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<COUNTY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<STATE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<POSTAL PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<GEO_CODE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<IN_CITY_LIMIT PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS1_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS2_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<ADDRESS3_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<CITY_AC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<REG_REGION PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<LASTUPDDTTM PSFIELDTYPE="DATETIME" PSOBJECTTYPE="FIELD"/>
<LASTUPDOPRID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
</ADDRESSES>
</ROW>
</ADDRESSES>
</ROW>
</PERSON>
</response>
Example 4 - Excluding Fields
You can also exclude fields by pushing to an array on the class of the fields you do not want to write. These are fields that could be sensitive or you don’t want to show to a client. Here is the sample code. Here we are telling the class to not write the DT_OF_DEATH
or BIRTHDATE
fields.
&p2XML.fieldsToSkip.Push("DT_OF_DEATH");
&p2XML.fieldsToSkip.Push("BIRTHDATE");
Local Record &recPerson4 = CreateRecord(Record.PERSON);
&recPerson4.EMPLID.Value = ¶mEMPLID;
&recPerson4.SelectByKey();
&childNode = &p2XML.RecordToXML(&xmlout.DocumentElement, &recPerson4);
You will see in the output that those fields are not included.
<?xml version="1.0"?>
<response>
<PERSON PSOBJECTTYPE="RECORD">
<EMPLID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">L00013</EMPLID>
<BIRTHDATE PSFIELDTYPE="DATE" PSOBJECTTYPE="FIELD">1950-04-01</BIRTHDATE>
<BIRTHPLACE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<BIRTHCOUNTRY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">USA</BIRTHCOUNTRY>
<BIRTHSTATE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<LAST_CHILD_UPDDTM PSFIELDTYPE="DATETIME" PSOBJECTTYPE="FIELD">2009-04-14-10.26.08.000000</LAST_CHILD_UPDDTM>
</PERSON>
</response>
Example 5 - Changing the Location in the XML.
All the encoding methods take a “xml parent node” as a parameter. This gives it a pointer to an xml tree to append to. So really you can write it anywhere. Your code can mix in free form XML elements with PeopleSoft objects. The following is an example of appending the PERSON
and PSOPRDEFN
records under two different XML parent nodes.
Local Record &recPerson5 = CreateRecord(Record.PERSON);
&recPerson5.EMPLID.Value = ¶mEMPLID;
&recPerson5.SelectByKey();
Local XmlNode &tempNode;
&tempNode = &xmlout.DocumentElement.AddElement("PERSON_DATA");
&childNode = &p2XML.RecordToXML(&tempNode, &recPerson5);
&tempNode = &xmlout.DocumentElement.AddElement("SECURITY_DATA");
Local Record &recOPR5 = CreateRecord(Record.PSOPRDEFN);
SQLExec("%selectall(:1) WHERE PSOPRDEFN.EMPLID = :2", &recOPR5, ¶mEMPLID, &recOPR5);
&childNode = &p2XML.RecordToXML(&tempNode, &recOPR5);
<?xml version="1.0"?>
<response>
<PERSON_DATA>
<PERSON PSOBJECTTYPE="RECORD">
<EMPLID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">PN001</EMPLID>
<BIRTHDATE PSFIELDTYPE="DATE" PSOBJECTTYPE="FIELD">1961-01-01</BIRTHDATE>
<BIRTHPLACE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<BIRTHCOUNTRY PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">USA</BIRTHCOUNTRY>
<BIRTHSTATE PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">FL</BIRTHSTATE>
<DT_OF_DEATH PSFIELDTYPE="DATE" PSOBJECTTYPE="FIELD"/>
<LAST_CHILD_UPDDTM PSFIELDTYPE="DATETIME" PSOBJECTTYPE="FIELD">2016-02-08-10.01.24.000000</LAST_CHILD_UPDDTM>
</PERSON>
</PERSON_DATA>
<SECURITY_DATA>
<PSOPRDEFN PSOBJECTTYPE="RECORD">
<OPRID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">AJORDAN</OPRID>
<USERIDALIAS PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<VERSION PSFIELDTYPE="NUMBER" PSOBJECTTYPE="FIELD">2911</VERSION>
<OPRDEFNDESC PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">Alic Jordan</OPRDEFNDESC>
<EMPLID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">PN001</EMPLID>
<EMAILID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<OPRCLASS PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">HCPPPCNSI</OPRCLASS>
<ROWSECCLASS PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">HCDPPCNSI</ROWSECCLASS>
<OPERPSWD PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD"/>
<PTOPERPSWDV2 PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">{3}aWD90N60xnjv0AFEwYkzs3no7ZilPvQvBJEgJXupXjc=</PTOPERPSWDV2>
<OPERPSWDSALT PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">uq6icV4d0KaKPCvcyENZaw==</OPERPSWDSALT>
<ENCRYPTED PSFIELDTYPE="NUMBER" PSOBJECTTYPE="FIELD">1</ENCRYPTED>
<SYMBOLICID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">SYSADM1</SYMBOLICID>
<LANGUAGE_CD LongTranslateValue="English" PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">ENG</LANGUAGE_CD>
<MULTILANG PSFIELDTYPE="NUMBER" PSOBJECTTYPE="FIELD">0</MULTILANG>
<CURRENCY_CD PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">USD</CURRENCY_CD>
<LASTPSWDCHANGE PSFIELDTYPE="DATE" PSOBJECTTYPE="FIELD">2017-07-18</LASTPSWDCHANGE>
<ACCTLOCK PSFIELDTYPE="NUMBER" PSOBJECTTYPE="FIELD">1</ACCTLOCK>
<PRCSPRFLCLS PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">HCSPPRFL</PRCSPRFLCLS>
<DEFAULTNAVHP PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">HCSPNAVHP</DEFAULTNAVHP>
<FAILEDLOGINS PSFIELDTYPE="NUMBER" PSOBJECTTYPE="FIELD">0</FAILEDLOGINS>
<EXPENT PSFIELDTYPE="NUMBER" PSOBJECTTYPE="FIELD">0</EXPENT>
<OPRTYPE PSFIELDTYPE="NUMBER" PSOBJECTTYPE="FIELD">0</OPRTYPE>
<LASTSIGNONDTTM PSFIELDTYPE="DATETIME" PSOBJECTTYPE="FIELD"/>
<LASTUPDDTTM PSFIELDTYPE="DATETIME" PSOBJECTTYPE="FIELD">2017-06-30-20.51.08.000000</LASTUPDDTTM>
<LASTUPDOPRID PSFIELDTYPE="CHAR" PSOBJECTTYPE="FIELD">PPLSOFT</LASTUPDOPRID>
<PTALLOWSWITCHUSER PSFIELDTYPE="NUMBER" PSOBJECTTYPE="FIELD">0</PTALLOWSWITCHUSER>
</PSOPRDEFN>
</SECURITY_DATA>
</response>
Getting The code
You can grab the PeopleSoft project on the github page psoftToXML
Article Categories
Chris Malek
Chris Malek is a PeopleTools® Technical Consultant with two decades of experience working on PeopleSoft enterprise software projects. He is available for consulting engagements.
About Chris Work with ChrisPeopleSoft Simple Web Services (SWS)
Introducing a small but powerful PeopleSoft bolt-on that makes web services very easy. If you have a SQL statement, you can turn that into a web service in PeopleSoft in a few minutes.
Integration Broker - The Missing Manual
I am in the process of writing a book called "Integration Broker - The Missing Manual" that you can read online.