0

XMLDataProvider を使用して RSS データを取得する、非常に単純な XAML RSS リーダーを WPF で作成しました。その XAML は次のようになります。

<XmlDataProvider x:Key="rssData" XPath="//item" Source="http://www.theglobeandmail.com/?service=rss" IsAsynchronous="True" IsInitialLoadEnabled="True" />

次に、次のように ListItemTemplate 内の RSS フィードによって提供される説明を表示します (無関係な詳細は省略されています)。

<TextBlock TextWrapping="Wrap" Text="{Binding XPath=description}"/>

問題は、説明内のエスケープされた文字が処理されないことです。例: 市長の計画などを非難する公開状

&146; もちろん、アポストロフィに変換する必要があります。これをかなり簡単に行うバインディング コンバーターを作成することはできますが、そうする必要はないと思います。私が見逃している簡単なことは何ですか?

助けてくれてありがとう。

4

1 に答える 1

0

もっと良い方法があることをまだ望んでいますが、今のところ、値コンバーターを実装し、HTML デコーダーを使用して、文字 &145; を手動で修正しました。&149; を介して。しかし、私はより良い解決策を受け入れています!

public class HTMLEscapedCharactersConverter : IValueConverter
{
    private static readonly char[] MapChars = {'\x091', '\x092', '\x093', '\x094'};

    object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var htmlText = value as string;
        if (!string.IsNullOrEmpty(htmlText))
        {
            htmlText = System.Net.WebUtility.HtmlDecode(htmlText);
            if (htmlText.IndexOfAny(MapChars) > 0)
            {
                var decodedText = new StringBuilder(htmlText.Length);
                foreach (var ch in htmlText)
                    switch (ch)
                    {
                        // Windows Code page 1252: http://en.wikipedia.org/wiki/Windows-1252 
                        case '\x091':
                            decodedText.Append('\x2018');
                            break;

                        case '\x092':
                            decodedText.Append('\x2019');
                            break;

                        case '\x093':
                            decodedText.Append('\x201C');
                            break;

                        case '\x094':
                            decodedText.Append('\x201D');
                            break;

                        default:
                            decodedText.Append(ch);
                            break;
                    }
                return decodedText.ToString();
            }
        }

        return htmlText ?? String.Empty;
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var s = value as string;
        if (s != null)
        {
            s = WebUtility.HtmlEncode(s);
        }

        return s ?? String.Empty;
    }
}
于 2011-09-16T15:42:04.353 に答える