Monday, March 22, 2010

Adding Rich Text from SharePoint to an Infopath Form

Problem Scenario:
You are trying to add the value from a Rich Text field from SharePoint to an Infopath form. This is a common scenario when trying to create custom Workflows in Visual Studio with Infopath Form support.

Your Rich Text does not appear in the infopath form. Any text which is not marked up does not appear. Text outside of tags does appear.

After some digging I figured that InfoPath requires the xhtml Namespace to be present for any data within a Rich Text field. After a lot of digging into XmlParsers, XMLNameSpaceManagers, XmlNameTables and the likes I found a very simple solution.
When passing the value over to the ExentedProperty in your Workflow, wrap the string with a div tag that has the xmlns='' attribute on it.

string htmlText = "<div xmlns=''>"
+ workflowProperties.Item.Title
+ "<br/>"
+ workflowProperties.Item["Body"]
+ "</div>";

TaskProperties.ExtendedProperties["Instructions"] = htmlText ;

Just one thing missing now. Infopath translates your valid xhtml and shows the actual tags. To solve this problem you will need to add some parsing to the load method of the form. Yes, that means that you will need to deploy some code with the form. But it's no biggie. Promise.
A fellow blogger has a great post on how to stop Infopath escaping the html

So I thought I nailed it! Well, as long as you do not attempt to open that infopath form using infopath! As that will throw a security exception due to the underlying code. But hey! It's on the server you might say. Being hosted by Infopath Forms Server. Nobody would wanna open it in infopath anyway. Ha. Outlook 2007 does! So when your Outlook 2007 users hit the Edit this Task button, instead of getting a nice RichtText experience, they get a security error complaining about a missing digital signature.

Sorry folks. Back to the basics on this one. I'll just strip out all HTML before passing it to Infopath using Regular expressions. A nice one to achieve this is
string stripped = Regex.Replace(textBox1.Text,@"<(.|\n)*?>",string.Empty);

(found via

Wednesday, March 3, 2010

i4i XML ruling and Office 2007

I've been getting more and more people ask me what I think about the i4i ruling which has caused Microsoft to pay hundreds of millions in damages and rework Word 2007 and Office 2010.
When I first read about it, I thought "What the heck! who does i4i think they are? The inventors of XML?" But then I read a bit more and Had a look at their patent in more detail

In that patent i4i effectively claim to be the inventor of separating content from structure. Kinda what XML is all about. But then remember, the patent was issued back in 1998, when XML was still a vision and SGML was being used more heavily in the publishing industry.

So are they actually claiming to be the inventors of XML? No. Not at all. What they thought of back then effectively was a way of mapping the look and feel of a document to the data. The key here being mapping. Very similar to what xsl was designed to do.

Some info on chronological events back then in the 90s:

02 Jue 1994: i4i file a patent outlining the concept and process of splitting all formatting from the data, keeping both separate and applying a mapping mechanism to create the final output

10 February 1998: first recommendation recorded at for XML

28 July 1998: i4i patent is approved

18 August 1998: first draft specification for xsl recorded at

2003: Microsoft launches word 2003 with the ability to store tagged data in a separate area fo the document and use mapping techniques to inject the data in the desired locations on the page and apply formatting to them.

2007: Microsoft launches the new docx office document format which includes the ability to store xml data in a separate location of the file and uses mapping techniques to inject the data into the document.

So did i4i invent xml? No. they took SGML to the next level parallel to the developments in xml and xsl.
Should their patent have been approved? I guess so. It was ground breaking stuff back then and should be appreciated for its innovation. That's what innovation is all about.

Some more info from fellow bloggers: