CDATA Mapping Experience Inside BizTalk
XML CDATA is something I was not really familiar with before. Xml parsers normally parse all text in an xml document. Text inside a CDATA section is ignored. This week I stumbled over CDATA sections inside a message. This message I had to map to another message with a different structure and later on had to be passed to a web service. During mapping I seem to have lost the CDATA Section. I googled around, but I could not find a satisfactory solution to my problem. So I started experimenting with inline xslt and c# inside a script functoid. Unfortunately I had no result. I got CDATA section around data, but <> translated into ;lt and ;gt when I opened the resulting message inside notepad (when I temporarily saved it to file). In the end I got fed up with it and called a function inside a class module. I created a component (class library) with the class module and passed the mapped message as xml document to function I created. The function is listed below:
public XmlDocument AddCDataSection(XmlDocument xmlDoc)
{
XmlNodeList xmlNodeList = xmlDoc.DocumentElement.SelectNodes(xpathquery);
foreach (XmlNode node in xmlNodeList)
{
string x = node.InnerText;
string lang = String.Empty;
if (node.Attributes[“lang”] != null)
{
lang = node.Attributes[“lang”].InnerText;
}
node.InnerText = string.Empty;
node.AppendChild(xmlDoc.CreateCDataSection(x));
XmlAttribute att = xmlDoc.CreateAttribute(“lang”);
att.Value = lang;
node.Attributes.Append(att);
}
return xmlDoc;
}
The returned document I copied back into a new message inside a message assign shape. This gave me the desired result. Maybe there is a better way of mapping inside BizTalk with CDATA Sections. If anybody knows a better solution to CDATA Section and mapping I am happy to hear about it.
Technorati:BizTalk BizTalk Mapping CDATA
CDATA Mapping Experience Inside BizTalk