I'm trying to read an xmlStreamReader (DepthXMLStreamReader received by the http connector) using the org.mule.module.xml.util.XMLUtils static methods. And I found that CDATA text parts are just ignored. I wrote a simple Main class that shows the problem :
public class Main {
public static void main(String[] args) throws Exception {
InputStreamReader isr = new InputStreamReader(ClassLoader.getSystemResourceAsStream("my_file.xml"));
XMLInputFactory xmlif = XMLInputFactory.newInstance();
XMLStreamReader xmlsr = xmlif.createXMLStreamReader(isr);
DepthXMLStreamReader reader = new DepthXMLStreamReader(xmlsr);
Document doc = XMLUtils.toW3cDocument(reader);
System.out.println("<" + doc.getChildNodes().item(0).getNodeName() + ">");
for (int i = 0; i < doc.getChildNodes().item(0).getChildNodes().getLength(); i++) {
//Skip spaces and Co : NodeType=#text
if(doc.getChildNodes().item(0).getChildNodes().item(i).getNodeType() != Node.TEXT_NODE){
System.out.print("\t<" + doc.getChildNodes().item(0).getChildNodes().item(i).getNodeName() + ">");
System.out.print(doc.getChildNodes().item(0).getChildNodes().item(i).getTextContent());
System.out.println("</" + doc.getChildNodes().item(0).getChildNodes().item(i).getNodeName() + ">");
}
}
System.out.println("</" + doc.getChildNodes().item(0).getNodeName() + ">");
}
}
My xml file looks like this :
<ser:messageTag xmlns:ser="http://test.com/">
<ser:message>normalTEXT<![CDATA[<Info>Test</Info>]]>normalTEXT</ser:message>
<!--Optional:-->
<ser:testFlag>Test</ser:testFlag>
</ser:messageTag>
And I get the following result (all the CDATA part is lost):
<ser:messageTag>
<ser:message>normalTEXTnormalTEXT</ser:message>
<#comment>Optional:</#comment>
<ser:testFlag>Test</ser:testFlag>
</ser:messageTag>
I get the same result in a Mule environemment and with the "XMLUtils.toDocument" method.
Do you have any idea why the XMLUtils method is not working with CDATA text element ?
Thanks in advance
Pascal
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email
public class Main {
public static void main(String[] args) throws Exception {
InputStreamReader isr = new InputStreamReader(ClassLoader.getSystemResourceAsStream("my_file.xml"));
XMLInputFactory xmlif = XMLInputFactory.newInstance();
XMLStreamReader xmlsr = xmlif.createXMLStreamReader(isr);
DepthXMLStreamReader reader = new DepthXMLStreamReader(xmlsr);
Document doc = XMLUtils.toW3cDocument(reader);
System.out.print("<\");
System.out.println(doc.getChildNodes().item(0).getNodeName());
System.out.print(">\");
for (int i = 0; i < doc.getChildNodes().item(0).getChildNodes().getLength(); i++) {
//Skip spaces and Co : NodeType=#text
if(doc.getChildNodes().item(0).getChildNodes().item(i).getNodeType() != Node.TEXT_NODE){
System.out.print("\t<\");
System.out.print(doc.getChildNodes().item(0).getChildNodes().item(i).getNodeName());
System.out.print(">\");
System.out.print(doc.getChildNodes().item(0).getChildNodes().item(i).getTextContent());
System.out.print("</\");
System.out.println(doc.getChildNodes().item(0).getChildNodes().item(i).getNodeName());
System.out.print(">\");
}
}
System.out.print("</\");
System.out.println(doc.getChildNodes().item(0).getNodeName());
System.out.print(">\");
}
}
and my xml is also well formatted but got trapped too :)
<ser:messageTag xmlns:ser="http://test.com/">
<ser:message>NoCDATA<![CDATA\[<Info>CDATA</Info>\]\]>NoCDATA</ser:message>
<!--Optional:-->
<ser:testFlag>Test</ser:testFlag>
</ser:messageTag>
---------------------------------------------------------------------
Chris
<custom-transformer name="xmlStreamReaderToDocumentTransformer" class="com.test.mule.util.XmlStreamReaderToDocumentTransformer" />
<custom-transformer name="domDocumentToXml" class="org.mule.module.xml.transformer.DomDocumentToXml" />
<mule-xml:xslt-transformer xsl-file="void.xslt" name="voidXsltTransformer" />
<flow name="flow">
<http:inbound-endpoint address="http://host:port/path"
exchange-pattern="request-response">
<transformer ref="voidXsltTransformer" />
<cxf:proxy-service wsdlLocation="wsdl/TIPS_messageIREService.wsdl" service="MessageIREService"
namespace="http://test.com/" payload="body" />
<transformer ref="xmlStreamReaderToDocumentTransformer" />
<transformer ref="domDocumentToXml" />
</http:inbound-endpoint>
<vm:outbound-endpoint path="perturbation-to-sharp_vm" exchange-pattern="request-response" />
</flow>
My XmlStreamReaderToDocumentTransformer class is simply doing "return XMLUtils.toDocument(src, muleContext);"
If I remove <transformer ref="voidXsltTransformer" /> I loose the CDATA part like I said in the previous post.
I attached the xslt file.
if(doc.getChildNodes().item(0).getChildNodes().item(i).getNodeType() != Node.TEXT_NODE)
CDATA sections create CDATA nodes, not TEXT nodes. Try replacing it with
if (! (doc.getChildNodes().item(0).getChildNodes().item(i) instanceof Text))
which works correctly, because the interface CDATASection extends Text.
Mike
Chris