Ever wondered how to get a IE like look and feel of the xml in the default WPF web browser control? If your answer is – “Just navigate the Web Browser to the xml path”; You are right! But if you have to navigate to a in-memory xml? Read on to know and apply IE like styling for xml stored in a string variable.
Idea of writing a custom based xml browser control came in because I had a requirement to edit the xml on fly and validate it against a specified schema. User is allowed to edit only the standard xml(compiled as an embedded resource) that the tool provides and not navigate to any path.
This control helps you:
- Load the xml from the string and apply IE like styling
- Edit the xml
- Validate the xml against the defined schema
Before I go further, here is what you get:
The problem with web browser when navigating to a string is that it does not load the style for it. Hence the work around is to transform the xml and navigate to it. To do so you need the Xslt that IE uses. After googling for “xml pretty print”, I finally got one originally written by Jonathan Marsh of Microsoft for IE5 and modified by Steve Muench for conversion to XSLT 1.0 REC. Copy the xml from here.
And here is the code to transform it:
/// <summary> /// Executes when XmlDoc DP is changed, Loads the xml and tranforms it using XSL provided /// </summary> /// <param name="d"></param> /// <param name="e"></param> public static void
browserControl = d as XmlBrowserControl
(browserControl == null
xmlString = e.NewValue as string
var xmlDocument = new XmlDocument();
var xmlDocStyled = new StringBuilder(2500);
// mark of web – to enable IE to force webpages to run in the security zone of the location the page was saved from
xmlDocStyled.Append("<!– saved from url=(0014)about:internet –>");
var xslt = new XslCompiledTransform();
//TODO: Do not forget to change the namespace, if you move the xsl sheet to your application
var xsltFileStream =
if (xsltFileStream != null)
//Load the xsltFile
var xmlReader = XmlReader.Create(xsltFileStream);
var settings = new XmlWriterSettings();
// writer for transformation
var writer = XmlWriter.Create(xmlDocStyled, settings);
if (xmlString != null) xmlDocument.LoadXml(xmlString);
browserControl.EditText.Text = xmlString;
browserControl.EditButton.Visibility = System.Windows.Visibility.Visible;
browserControl.CopyClipButton.Visibility = System.Windows.Visibility.Visible;
catch (Exception ex)
browserControl.WebBrowser.NavigateToString("Unable to parse xml. Correct the following errors: " + ex.Message);
XSLT is provided as an embedded resource and it is loaded from the code. If you are moving the xslt to your project, make sure to change the namespace in the calling code.
You can download the code from my share here. This code works on my machine!
Feel free to modify the code, but as usual you don’t get warranty!