Проблемы читая RSS с C# и .net 3.5

Подклассы

class CustomTabBarController:  UITabBarController {

- это причина, по которой вы должны использовать AZTabBarController напрямую. То, что вы видите в качестве поля в нижней части, это tabBar родительского класса, который пуст, потому что вы не установили никакой viewControllers для этого

16
задан dan90266 16 October 2008 в 21:27
поделиться

3 ответа

Отформатированные ленты RSS RSS 2.0 используют спецификация даты и времени RFC 822 при сериализации элементов как pubDate и lastBuildDate. Спецификация даты и времени RFC 822 является, к сожалению, 'очень гибким' синтаксисом для выражения компонента часового пояса DateTime.

Часовой пояс может быть обозначен несколькими способами. "UT" является Всемирное время (раньше названный "Средним временем по Гринвичу"); "GMT" разрешен как ссылка на Всемирное время. Военный стандарт использует отдельный символ для каждой зоны. "Z" является Всемирное время. Указывание одним часом ранее и "M" указывают 12 часами ранее; "N" один час спустя, и "Y" 12 часов спустя. Буква "J" не используется. Другое оставление двумя формами взято из стандарта ANSI X3.51-1975. Каждый позволяет явный признак объема смещения от UT; другое использование общие 3 символьных строки для указания на часовые пояса в Северной Америке.

я полагаю, что проблема включает, как зона компонент значения даты и времени RFC 822 обрабатывается. Средство форматирования канала, кажется, не обрабатывает времена даты, которые используют локальный дифференциал для указания на часовой пояс.

, Поскольку RFC 1123 расширяет спецификацию RFC 822, Вы могли попытаться использовать DateTimeFormatInfo. RFC1123Pattern ("r"), чтобы обработать преобразовывающие проблематичные времена даты или записать Ваш собственный парсинг кодируют для отформатированных дат RFC 822. Другая опция состояла бы в том, чтобы использовать стороннюю платформу вместо Системы. ServiceModel. Классы пространства имен синдикации.

кажется, что существуют [приблизительно 112] известные проблемы с парсингом даты и времени и Rss20FeedFormatter, которые находятся в процессе того, чтобы быть обращенным Microsoft.

9
ответ дан 30 November 2019 в 16:37
поделиться

Интересный. Это было бы быть похожим на форматирование даты и времени не быть одним из тех естественно ожидаемых синтаксическим анализатором даты и времени. После рассмотрения классов канала не похоже, что можно ввести в собственном соглашении форматирования для синтаксического анализатора, и они это, вероятно, использует определенную схему проверки чувства.

можно быть в состоянии измениться, как синтаксический анализатор даты и времени ведет себя путем изменения культура . Я никогда не делал его прежде, таким образом, я не могу сказать наверняка, что это работало бы.

Другая ночь решения для первого преобразования канала Вы пытаетесь читать. Вероятно, не самое большое, но это могло получить Вас вокруг проблемы.

Удача.

2
ответ дан 30 November 2019 в 16:37
поделиться

На основе обходного пути, опубликованного в отчете об ошибке в Microsoft по этому поводу Я сделал XmlReader специально для чтения SyndicationFeeds с нестандартными датами.

Приведенный ниже код немного отличается от кода обходного пути на сайте Microsoft. Он также принимает совет оппозиционера по использованию шаблона RFC 1123.

Вместо простого вызова XmlReader.Create () вам нужно создать XmlReader из Stream. Я использую класс WebClient, чтобы получить этот поток:

WebClient client = new WebClient();
using (XmlReader reader = new SyndicationFeedXmlReader(client.OpenRead(feedUrl)))
{
    SyndicationFeed feed = SyndicationFeed.Load(reader);
    ....
    //do things with the feed
    ....
}

Ниже приведен код SyndicationFeedXmlReader:

public class SyndicationFeedXmlReader : XmlTextReader
{
    readonly string[] Rss20DateTimeHints = { "pubDate" };
    readonly string[] Atom10DateTimeHints = { "updated", "published", "lastBuildDate" };
    private bool isRss2DateTime = false;
    private bool isAtomDateTime = false;

    public SyndicationFeedXmlReader(Stream stream) : base(stream) { }

    public override bool IsStartElement(string localname, string ns)
    {
        isRss2DateTime = false;
        isAtomDateTime = false;

        if (Rss20DateTimeHints.Contains(localname)) isRss2DateTime = true;
        if (Atom10DateTimeHints.Contains(localname)) isAtomDateTime = true;

        return base.IsStartElement(localname, ns);
    }

    public override string ReadString()
    {
        string dateVal = base.ReadString();

        try
        {
            if (isRss2DateTime)
            {
                MethodInfo objMethod = typeof(Rss20FeedFormatter).GetMethod("DateFromString", BindingFlags.NonPublic | BindingFlags.Static);
                Debug.Assert(objMethod != null);
                objMethod.Invoke(null, new object[] { dateVal, this });

            }
            if (isAtomDateTime)
            {
                MethodInfo objMethod = typeof(Atom10FeedFormatter).GetMethod("DateFromString", BindingFlags.NonPublic | BindingFlags.Instance);
                Debug.Assert(objMethod != null);
                objMethod.Invoke(new Atom10FeedFormatter(), new object[] { dateVal, this });
            }
        }
        catch (TargetInvocationException)
        {
            DateTimeFormatInfo dtfi = CultureInfo.CurrentCulture.DateTimeFormat;
            return DateTimeOffset.UtcNow.ToString(dtfi.RFC1123Pattern);
        }

        return dateVal;

    }

}

Опять же, он почти точно скопирован из обходного пути, опубликованного на сайте Microsoft по ссылке выше. ... за исключением того, что этот работает для меня, а тот, который размещен в Microsoft, - нет.

ПРИМЕЧАНИЕ : Вам может потребоваться настроить два массива в начале класса. В зависимости от каких-либо посторонних полей, которые может добавить нестандартный канал, вам может потребоваться добавить больше элементов в эти массивы.

26
ответ дан 30 November 2019 в 16:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: