So, we tackled the xml issue by implementing our own EventReaderDesierializer.
It takes a list of namespaces that we are looking for and finds those values and puts them in a map. It's no xpath, but it at least will handle deep structures. Note: The namespaces need to be unique, you will get collisions if you don't.
Code:
public class NamespaceBasedEventReaderDeserializer implements EventReaderDeserializer
{
private Log logger = LogFactory.getLog(NamespaceBasedEventReaderDeserializer.class);
private List<String> namespaces = new ArrayList<String>();
public Object deserializeFragment(XMLEventReader eventReader)
{
Map<String, String> aliases = new HashMap<String, String>();
if(namespaces.isEmpty())
{
logger.warn("We are not looking for any data in our pathBasedEventReader - ");
return aliases;
}
List<String> localPaths = new ArrayList<String>(namespaces);
while(eventReader.hasNext())
{
XMLEvent event = (XMLEvent) eventReader.next();
for(Iterator<String> iterator = localPaths.iterator(); iterator.hasNext();)
{
String key = iterator.next();
if(StringUtils.contains(event.getLocation().toString(), key)
&& event.isStartElement())
{
XMLEvent found = (XMLEvent) eventReader.next();
if(found.getEventType() == XMLStreamConstants.CHARACTERS)
{
String value = found.toString().trim();
aliases.put(key, value);
iterator.remove();
}
}
}
}
return aliases;
}
/**
* @return the namespaces
*/
public List<String> getNamespaces()
{
return namespaces;
}
/**
* @param namespaces the namespaces to set
*/
public void setNamespaces(List<String> namespaces)
{
this.namespaces = namespaces;
}
}
Here is how we call it:
Code:
<property name="itemReader">
<bean class="org.springframework.batch.item.xml.StaxEventItemReader">
<property name="fragmentRootElementName"
value="order" />
<property name="resource"
value="com/bc/batch/mlregister/mldata.xml" />
<property name="fragmentDeserializer">
<bean
class="com.bc.batch.NamespaceBasedEventReaderDeserializer">
<property name="namespaces">
<list>
<value>customerCode</value>
<value>email</value>
</list>
</property>
</bean>
</property>
</bean>
</property>