【问题标题】:How can I make xmldataprovider process escaped characters?如何使 xmldataprovider 处理转义字符?
【发布时间】:2011-09-16 05:05:08
【问题描述】:

我在 WPF 中构建了一个非常简单的 XAML RSS 阅读器,使用 XMLDataProvider 来获取 RSS 数据。 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;当然,应该转换成撇号。我可以编写一个绑定转换器来相当容易地做到这一点,但我认为我不应该这样做。我错过了什么简单的事情?

提前感谢您的帮助。

【问题讨论】:

  • 遗憾的是,没有直接的方法可以让 XAML 或 WPF 理解 &146; 是撇号。作为基于 XML 的撇号表示为 &;

标签: c# wpf escaping xmldataprovider


【解决方案1】:

我仍然希望有更好的方法,但现在我实现了一个值转换器,使用了一个 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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多