IBM webMethods Hybrid Integration

IBM webMethods Hybrid Integration

Join this online group to communicate across IBM product users and experts by sharing advice and best practices with peers and staying up to date regarding product enhancements.

 View Only
  • 1.  Custom XML Parser

    Posted Tue January 21, 2020 10:00 AM

    As an exercise I am trying to create an XML parser using the built-in flow services and some custom Java services. I want to create a generic XML parser that can go through multiple levels of nested tags and map them into a hash table, creating a flat structure. To achieve this I have created an recursive flow service that takes the XML file as a document(pub: xml: xmlNodeToDocument) and moves through the tags using a custom Java service and an IData Cursor. As I am stuck with my solution I wanted to get some fresh ideas. So if you wanted to create a generic XML parser to get the tags into a flat structure (like a hash table) how would you do it?

    Example Input:

    John Jill 2020

    Example Output:
    Body/Record/Employee: John
    Body/Record/Student: Jill
    Body/Date: 2020


    #Integration-Server-and-ESB
    #Flow-and-Java-services
    #webMethods


  • 2.  RE: Custom XML Parser

    Posted Thu April 01, 2021 02:01 PM

    Why rely on XML ?
    Convert the document to a document with xmlNodeToDocument and then use a java service to convert it to a map. I have posted code from own webMethods tools

    	 /**
    * Extracts all strings found in the IData record and returns them in a map. Sub records are also scanned.
    * Repeating key/value pairs overwrite previous pairs.
    *
    * @param record The IData record to convert to a map
    * @return Map A map of all key/value pairs in the IData structure without those pairs indicated by excludeList
    */
    public static Map<String, String> convertIDataStringsToMap(IData record)
    {
    return convertIDataStringsToMap(record, null);
    }
    
    /**
    * Extracts all strings found in the IData record and returns them in a map. Sub records are also scanned.
    * Repeating key/value pairs overwrite previous pairs.
    *
    * @param record The IData record to convert to a map
    * @param excludeList The names of keys to ignore, ie don't put in map
    * @return Map A map of all key/value pairs in the IData structure without those pairs indicated by excludeList
    */
    public static Map<String, String> convertIDataStringsToMap(IData record, String[] excludeList)
    {
    if (record == null)
    return null;
    
    IDataCursor cursor = record.getCursor();
    Map<String, String> stringMap = new HashMap<String, String>();
    
    while (cursor.next())
    {
    String key = cursor.getKey();
    Object value = cursor.getValue();
    
    if (value instanceof String && (excludeList == null || !isStringInArray(excludeList, key)))
    stringMap.put(key, (String) value);
    else if (value instanceof IData)
    stringMap.putAll(convertIDataStringsToMap((IData) value, excludeList));
    }
    
    cursor.destroy();
    
    return stringMap;
    }
    

    Sorry for not getting back to you sooner, We are now trying really hard to make sure someone will respond more time to questions raised here
    regards,
    John.


    #Flow-and-Java-services
    #webMethods
    #Integration-Server-and-ESB