Rendering XML as a FlowDocument

If you’d like to render XML as a WPF FlowDocument, give this a try (ClickOnce sample; source available here or on CodePlex).  Here’s a screenshot:

image

The useful part is the PrettyXmlConverter class (view here; it’s "self documenting" 🙂 ).  It’s implemented as an IValueConverter so you can easily include it in binding expressions:

<Window x:Class="XmlFlowDocumentSample.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:converters="clr-namespace:CJC.Wpf.Converters"
    Title="Pretty XML FlowDocument sample">

    <Window.Resources>
        <converters:PrettyXmlConverter x:Key="prettyXmlConverter"/>
        <XmlDataProvider x:Key="xmlSource" Source="Xml/Books.xml" IsAsynchronous="False"/>
    </Window.Resources>

    <Grid>

        <FlowDocumentReader ViewingMode="Scroll" Zoom="300"
                            Document="{Binding Source={StaticResource xmlSource}, Path=Document, BindsDirectlyToSource=true, Converter={StaticResource prettyXmlConverter}}">
        </FlowDocumentReader>

    </Grid>

</Window>

 

Currently it only renders elements and attributes, so no comments, processing instructions or explicit CDATA handling.  These could be added very easily if needed 🙂

The formatted XML pastes nicely into MS Word (formatting preserved).

DotNetKicks Image

7 Comments

  1. Thanks for sharing this information. However, i have question… using your source code is it possible to load the xml document w/o the element ” tags? only the contents.

    I’m a newbie in this approach but i wanted to see how i can load a simple XML file to a flowdocument.

    Thanks

    Reply

  2. Yes Chris. I wanted to omit the element not only the root element ‘catalog’ from your sample xml but also the child elements. Is there a way to achieve that? If does, please assist me.

    I highly appreciate your quick response.

    Thanks again and more power.

    Reply

Leave a comment