Using JudoScript to Convert XML into Java HashMap.
I’m finally a convert to the ranks of JudoScripters.
The following example doesn’t show the Java code (about 15 lines of code) that invokes the JudoScript because I wanted to keep this entry small.
My task was to maintain some information external to my Java program so I chose an XML format:
<requiredNodes>
<message type="all">
<requiredNode name="messageHeader" xpath="/eanucc:envelope/messageHeader"/>
</message>
<message type="eanucc:tradeItemDocument">
<requiredNode name="tid.gtin" xpath="/eanucc:envelope/../gtin"/>
<requiredNode name="tid.glnOfInformationProvider" xpath="/eanucc:envelope/../gln"/>
</message>
</requiredNodes>
In order to convert this file into an easily used Java object, I used JudoScript:
// ReadRequiredNodes.judo
requiredNodes = javanew java.util.HashMap();
$$bsf.registerBean("requiredNodes", requiredNodes);
do BRRequiredNodesFileName as xml {
<message>:
messageMap = requiredNodes.get($_.getAttrValue(0));
if messageMap == null {
messageMap = javanew java.util.HashMap();
requiredNodes.put($_.getAttrValue(0), messageMap);
}
<requiredNode>:
messageMap.put($_.getAttrValue(1), $_.getAttrValue(0));
}
Some issues to note:
- When using SAX-based XML processing, I needed to use attributes to hold the name and xpath because the XML processing in JudoScript seems to have a flaw. The $_ variable (the current xml node) can't be used as the key in a HashMap.
- When using SAX-based XML processing, There is no way to access attributes by name. Therefore the script uses index numbers which is brittle coding.
Overall, I found that JudoScript was easy to use and quite a compact way to handle the XML->HashMap transformation.