Search code examples
c#wpfmvvmrsscdata

Format CDATA Type from RSS with C# XDocument or XPath in WPF


I'm trying to format and get the image, text etc.. to give a good look and feel.

The XML is something like this:

xmlns:content="http://purl.org/rss/1.0/modules/content/"

And the content is:

<content:encoded>
<![CDATA[
<p><a href="http://i2.wp.com/geekytheory.com/wp-content/uploads/2014/03/Screen-Shot-     2013-11-11-at-11.38.50.png"><img class="size-full wp-image-7447 aligncenter" alt="Screen    Shot 2013-11-11 at 11.38.50" src="http://i2.wp.com/geekytheory.com/wp-  content/uploads/2014/03/Screen-Shot-2013-11-11-at-11.38.5
]]>
<![CDATA[
0.png?resize=788%2C644" data-recalc-dims="1" /></a></p> <p style="text-align:   justify">
</p>]]>
< /content:encoded>        

At first what I will get is the image or example: he is in content:encoded/p/a/img/src

the code that I try is:

private ObservableCollection<RssItem> ParseXmlString(string xmlString)
    {
        XDocument xmlDoc = XDocument.Parse(xmlString);
        XNamespace xmns = @"http://purl.org/dc/elements/1.1/";
        XNamespace xmnsContent = @"http://purl.org/rss/1.0/modules/content/";
        var itemsList = xmlDoc.Descendants("item").Select(i => new RssItem()
        {
            Author = i.Element(xmns + "creator").Value,
            Title = i.Element("title").Value,
            Description = i.Element("description").Value,
            Content = i.Element(xmnsContent + "encoded").Value,
            Image = i.Element(xmnsContent + "encoded").XPathSelectElement("//p//a//img[@src]").Value,
            Date = DateTime.Parse(i.Element("pubDate").Value)
        }).ToList();

        return new ObservableCollection<RssItem>(itemsList);
    }

The Content = i.Element(xmnsContent + "encoded").Value give me all the content without formatting something like this: enter image description here

And for exctract the image or some other element from the CData I get a error. Image = i.Element(xmnsContent + "encoded").XPathSelectElement("//p//a//img[@src]").Value is giving error.

I tried this way too, but giving the same error.

Image = i.Element(xmnsContent+"encoded").Element("p").Element("a").Element("img").Attribute("src").Value

Thanks for all and greetings!!


Solution

  • Finally with a FlowDocumentScrollViewer an the XmlToXamlConverter I get the solution:

    <FlowDocumentScrollViewer
       Document="{Binding Content, Converter={StaticResource HtmlToFlowDocConverter}}"/>
    

    After we need to add a Converter like:

    public object Convert(object value, Type targetType, object parameter,
      CultureInfo culture)
        {
    
            var xaml = HtmlToXamlConverter.ConvertHtmlToXaml((string)value, true);
            var flowDocument = XamlReader.Parse(xaml);
            if (flowDocument is FlowDocument)
                SubscribeToAllHyperlinks((FlowDocument)flowDocument);
            return flowDocument;
        }
    
        private void SubscribeToAllHyperlinks(FlowDocument flowDocument)
        {
            var hyperlinks = GetVisuals(flowDocument).OfType<Hyperlink>();
            foreach (var link in hyperlinks)
                link.RequestNavigate += LinkRequestNavigate;
        }
    
        private static IEnumerable<DependencyObject> GetVisuals(DependencyObject root)
        {
            foreach (var child in
               LogicalTreeHelper.GetChildren(root).OfType<DependencyObject>())
            {
                yield return child;
                foreach (var descendants in GetVisuals(child))
                    yield return descendants;
            }
        }
    
        private void LinkRequestNavigate(object sender,
          System.Windows.Navigation.RequestNavigateEventArgs e)
        {
            Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
            e.Handled = true;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter,
          CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    Finally we will add the XmlToXamlConverter from here and another from here.

    Another helpfull article for me was this.

    Greetings!