другой тест чтения атома терпит неудачу - PullRequest
0 голосов
/ 20 февраля 2012

Я использую эту функцию public static

    IList<Item> ParseAtom(string url)
    {
        try
        {
            XDocument doc = XDocument.Load(url);

            // Feed/Entry
            var entries = from item in doc.Root.Elements().Where(i => i.Name.LocalName == "entry")
                          select new Item
                          {
                              FeedType = FeedType.Atom,
                              Content = item.Elements().First(i => i.Name.LocalName == "content").Value,
                              Link = item.Elements().First(i => i.Name.LocalName == "link").Attribute("href").Value,
                              PublishDate = ParseDate(item.Elements().First(i => i.Name.LocalName == "published").Value),
                              Title = item.Elements().First(i => i.Name.LocalName == "title").Value
                          };

            return entries.ToList();
        }
        catch
        {
            return new List<Item>();
        }
    }

Я использую следующую ссылку http://localhost/posts.atom/

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

  1. 1 Ссылка 2 Ссылка 3 Ссылка 4 Ссылка

но я, когда я использую его в качестве URL для анализа, моя программа ничего не возвращает.Я полагаю, что я не понимаю, что на самом деле означает ссылка выше.Мне действительно нужна любая ваша помощь, чтобы предложить мне более подробное объяснение подачи атома, большое спасибо.

XML создается другим файлом, который сохраняется в виде потока, как в следующем формате

<Root>
  <Child id=123456>
     <Child1>Child1
     </Child1>  
     <Child2>Child2
     </Child2>  
  </Child>
</Root>

1 Ответ

2 голосов
/ 20 февраля 2012

I сильно подозревают, что генерируется исключение - но вы не можете сказать, потому что вы "обрабатываете" все исключения, возвращая пустой список, без записи того, чтоИсключением является или любой вид диагностики.Я бы лично убрал try / catch вообще: если что-то не так, зачем это скрывать?Если вы должны перехватить исключение, то перехватите определенных исключений и запишите их, чтобы вы знали, что произошло.

Ваш запрос также может быть значительно упрощен:

XDocument doc = XDocument.Load("atom.xml");
XNamespace ns = "http://www.w3.org/2005/Atom";

var entries = doc.Root
                 .Elements(ns + "entry")
                 .Select(item => new Item
                 {
                      FeedType = FeedType.Atom,
                      Content = (string) item.Element(ns + "content"),
                      Link = (string) item.Element(ns + "link").Attribute("href"),
                      PublishDate = (DateTime) item.Element(ns + "published"),
                      Title = (string) item.Element(ns + "title")
                  };

Обратите внимание, что теперь для Content и Title будет установлено значение null, если эти элементы не существуют;Измените на .Value еще раз, если вы хотите, чтобы он вызвал исключение.Вы можете получить то же поведение для PublishDate, приведя к DateTime? вместо DateTime, очевидно, после изменения типа свойства тоже.Обработка отсутствующих ссылок будет немного сложнее, но не так уж и плохо - дайте мне знать, если вам нужна помощь.

В принципе, я подозреваю, что это отсутствующий элемент - вполне возможно published.Хотя будет легче выяснить, когда вы регистрируете (или не ловите) исключения.

РЕДАКТИРОВАТЬ: Учитывая ваш комментарий, похоже, что это не имеет абсолютно никакого отношения к тому, как вы обрабатываете XML- это загрузка XML, который вызывает проблему.Здесь важно не глотать исключения ...

Я не знаю, как предоставить учетные данные при загрузке XML через XDocument.Load - вам, возможно, придется использовать WebRequest или WebClient дляполучить данные, а затем проанализировать их с помощью XDocument.Load(Stream).

...