JAX getting original xml while unmarshalling for a list of elements



I have an xml input as below



<Confirmations>
<SystemConf>
<SysCnf>
<MessageId>1</MessageId>
</SysCnf>
<SysCnf>
<MessageId>2</MessageId>
</SysCnf>
</SystemConf>
</Confirmations>


and these are my classes



@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Confirmations")

public class Confirmations
{

@XmlElementWrapper(name = "SystemConf")
@XmlElement(name = "SysCnf")
private List<SystemConfirmation> systemConfirmations = null;


public List<SystemConfirmation> getSystemConfirmations()
{
return systemConfirmations;
}

public void setSystemConfirmations(List<SystemConfirmation> systemConfirmations)
{
this.systemConfirmations = systemConfirmations;
}

}


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "SysCnf")
public class SystemConfirmation
{
@XmlElement(name = "MessageId")
private String messageId;

public void setMessageId(String messageId)
{
this.messageId = messageId;
}

public String getMessageId()
{
return messageId;
}


@XmlAnyElement(value = SysConfXmlStringHandler.class)
private String xml;


public String getXml()
{
return xml;
}
}


public class SysConfXmlStringHandler implements DomHandler<String, StreamResult>
{
private static final String SYSCONF_START_TAG = "<SycCnf>";

private static final String SYSCONF_END_TAG = "</SysCnf>";
private StringWriter xmlWriter = new StringWriter();

@Override
public StreamResult createUnmarshaller(ValidationEventHandler errorHandler)
{
return new StreamResult(xmlWriter);
}

@Override
public String getElement(StreamResult rt)
{
String xml = rt.getWriter().toString();
System.out.println(xml);
int beginIndex = xml.indexOf(SYSCONF_START_TAG) + SYSCONF_START_TAG.length();
int endIndex = xml.indexOf(SYSCONF_END_TAG);
return xml.substring(beginIndex, endIndex);
}

@Override
public Source marshal(String n, ValidationEventHandler errorHandler)
{
try
{
String xml = SYSCONF_START_TAG + n.trim() + SYSCONF_END_TAG;
StringReader xmlReader = new StringReader(xml);
return new StreamSource(xmlReader);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
}


Question In the xml field of the SystemConfirmation class I want the whole xml of that particular SystemConfirmation block xmml element, which would be below



<SysCnf>
<MessageId>1</MessageId>
</SysCnf>


Does anyone know how to achieve this? I tried the above code but I was only getting MessageId block in the xml and if I add multiple fields in SystemConfirmation than I only get the first one.


No comments:

Post a Comment