Wednesday, May 23, 2018

DocToDOM functionality inin IBM Sterling Integrator

Working with XPath function DocToDOM (CSE-Sterling B2B Integrator)

You can move data from the Primary Document or any other document to the Process Data areas in IBM Sterling B2B Integrator (ISBI) by using the DocToDOM xpath function.
The data in the source document is required to be a valid XML document for the DocToDOM function to work correctly.

This blog aims to clarify the usage of the DocToDOM xPath function in ISBI and provide clear examples of its usage.

For the official ISBI Documentation about this function, please see links below:

xPath and Process Data in ISBI and DocToDOM function in ISBI


DocToDOM parameters:

DocToDOM(xpath expression [, validate, loadDTD])


Xpath expression (Required): This is the xpath query to execute against ProcessData to find the node where the
document to be used is located.  
The node returned needs to have an SCIObjectID attribute.   

validate (Optional): whether to validate the XML document or not, Default value is true.

loadDTD (Optional): Determines if the parser loads the DTD, as specified. Default value is true.


Example usages of DocToDOM functions:

Unless stated otherwise, the examples below will be assumed to be using the following XML document as the input:

<Header>
<Body>
<Partner>
<Name>CompanyA</Name>
<Contact>PersonA</Contact>
</Partner>
<DocType>ORDERS</DocType>
<OrderNumber>12345</OrderNumber>
</Body>
</Header>

---------------Moving the complete contents of the PrimaryDocument to ProcessData---------------

In this example I’m attaching the entire contents of the primary document to process data.  
The nodes returned will be attached to the root of ProcessData.

<assign to="." from="DocToDOM(PrimaryDocument)"></assign>

Results in ProcessData:

<ProcessData>
  <PrimaryDocument SCIObjectID="rhel65_templ:node1:14f6fb36f06:7609060"/>
  <BPstart>ok</BPstart>
  <Header>
    <Body>
      <Partner>
        <Name>CompanyA</Name>
        <Contact>PersonA</Contact>
      </Partner>
      <DocType>ORDERS</DocType>
      <OrderNumber>12345</OrderNumber>
    </Body>
  </Header>
  <BPend>ok</BPend>
</ProcessData>


---------------Moving the complete contents of another Document into a specific node in ProcessData---------------

In this example I’m attaching the entire contents of document called MyDocSave to process data.  
The nodes returned will be attached to the node MyMessage.

<assign to="MyMessage" from=" DocToDOM(MyDocSave)"></assign>

Results in ProcessData:

<ProcessData>
  <PrimaryDocument SCIObjectID="rhel65_templ:node1:14f6fb36f06:7612152"/>
  <MyDocSave SCIObjectID="rhel65_templ:node1:14f6fb36f06:7612152"/>
  <MyMessage>
    <Header>
      <Body>
        <Partner>
          <Name>CompanyA</Name>
          <Contact>PersonA</Contact>
        </Partner>
        <DocType>ORDERS</DocType>
        <OrderNumber>12345</OrderNumber>
      </Body>
    </Header>
  </MyMessage>
</ProcessData>


---------------Moving specific nodes to ProcessData---------------

If the document you are working with is very large, it is not recommended to parse the full contents into ProcessData,
depending on how large the document is and how your system is configured, you could even get out of memory errors when using the DocToDOM function.

Instead of moving the complete document to ProcessData, it is recommended to move only the info you need to ProcessData

In this example, I’m specifying an additional xpath node (OrderNumber) that will be executed against the document in order to return only that node.

<assign to="." from=" DocToDOM(PrimaryDocument)//OrderNumber"></assign>
or
<assign to="." from=" DocToDOM(PrimaryDocument)/Header/Body/OrderNumber"></assign>

Results in ProcessData:

<ProcessData>
  <PrimaryDocument SCIObjectID="rhel65_templ:node1:14f6fb36f06:7630219"/>
  <OrderNumber>12345</OrderNumber>
</ProcessData>


---------------Moving only the value of a certain node into another node in ProcessData---------------

You can also retrieve only the value of certain nodes of your document and assign them to a different node in ProcessData.

In the example below, we will retrieve the value of Contact in the document and assign it to the node "CustomerContactName" in ProcessData.

<assign to="CustomerContactName" from=" DocToDOM(PrimaryDocument)//Contact/text()"></assign>

Results in ProcessData:

<ProcessData>
  <PrimaryDocument SCIObjectID="rhel65_templ:node1:14f6fb36f06:7638558"/>
  <CustomerContactName>PersonA</CustomerContactName>
</ProcessData>

---------------Solving XML validation errors---------------

When using DocToDOM, you might see validation error like below in the noapp log:

[STDERR] [Error] :1:46: Document is invalid: no grammar found.
[STDERR] [Error] :1:46: Document root element "Result", must match DOCTYPE root "null".

DocToDOM contains a validation routine, and it is set by default to validate input.
The error might occur when the document does not contain the values being searched.

The easiest way to get rid of that error is to turn the validation off for the DocToDOM function.

<assign to="." from="DocToDOM(PrimaryDocument,'false')"/>


---------------Using the DocToDOM directly in an adapter configuration---------------

This example uses the LJDBC adapter to execute a select SQL query against the ISBI database and place the results directly into ProcessData using the DocToDOM function.

Note also the validation is turned off to avoid the validation error in the noapp log as mentioned in previous example.

Business Process example:

<process name="DocToDOMexample">
 <sequence>
 <operation name="JDBCQuery">
 <participant name="LightweightJDBCAdapterQuery"/>
  <output message="LightweightJDBCAdapterTypeInputMessage">
   <assign to="query_type">SELECT</assign>
   <assign to="pool">oraclePool</assign>
   <assign to="row_name">Row</assign>
   <assign to="result_name">Result</assign>
   <assign to="sql">Select * from SI_VERSION</assign>
   <assign to="." from="*"/>
  </output>
  <input message="inmsg">
   <assign to="." from="DocToDOM(PrimaryDocument,'false')"/>
  </input>
 </operation>
 </sequence>
</process>


Results in ProcessData:

<ProcessData>
  <Result>
    <Row>
      <PRODUCT_LABEL>asset</PRODUCT_LABEL>
      <BUILD_NUMBER>4060500</BUILD_NUMBER>
      <LIC_PROD_VER>4_6</LIC_PROD_VER>
      <SI_INSTALL_DATE>2015-01-05 16:56:09.0</SI_INSTALL_DATE>
      <SI_COMMENTS>asset update</SI_COMMENTS>
    </Row>
    <Row>
      <PRODUCT_LABEL>B2BF</PRODUCT_LABEL>
      <BUILD_NUMBER>4020500</BUILD_NUMBER>
      <LIC_PROD_VER>4_2</LIC_PROD_VER>
      <SI_INSTALL_DATE>2015-01-05 16:52:47.0</SI_INSTALL_DATE>
      <SI_COMMENTS>B2BF update</SI_COMMENTS>
    </Row>
  </Result>
</ProcessData>



 

Comments (0)
  • Add a Comment
  • Edit
  • More Actions v
  • Quarantine this Entry

No comments:

Post a Comment

Introducing a rate limiter feature in IBM Sterling Integrator allows for comprehensive API functionality without the need to invest in additional API tools.

To activate and integrate the rate limiter feature in Sterling Integrator for comprehensive API functionality, follow these steps. To ...