Пишу новостной парсер. Был старый метод получения данных из RSS,попроще, он работал. Вот он:
public bool getNewArticles(string fileSource)
{
SampleContext pContext = new SampleContext();
GetKeyWords kWordsGetter = new GetKeyWords();
string head;
string syn;
string link;
string date;
string keyW;
string chanelName;
string[] sources =
{
"http://www.interfax.ru/rss.asp",
"http://www.mk.ru/rss/politics/index.xml"
};
try
{
XmlDocument doc = new XmlDocument();
doc.Load(fileSource);
XmlNodeList nodeList;
XmlNode root = doc.DocumentElement;
nodeList = root.ChildNodes;
int count = 0;
foreach (XmlNode chanel in nodeList)
{
foreach (XmlNode chanel_item in chanel)
{
if (chanel_item.Name == "item")
{
XmlNodeList itemsList = chanel_item.ChildNodes;
foreach (XmlNode item in itemsList)
{
if (item.Name == "title")
{
head = item.InnerText;
Console.WriteLine(head);
}
if (item.Name == "link")
{
link = item.InnerText;
Console.WriteLine(link);
}
if (item.Name == "description")
{
syn = item.InnerText;
}
context.News.Add(new DB.Table()
{
Id = count,
Head = head,
Link = link,
Synopsis = syn
});
context.SaveChanges();
}
count += 1;
}
}
}
return true;
}
catch (Exception ex)
{
return false;
}
}
}
Усовершенствовал метод, чтобы выделял из документа только политические новости посредством сравнения с категорией (item.Name = "category"), но код работать перестал, доходит только до title в документе, т.е. в консоль выдаёт head, а остальные if игнорирует. Вот усовершенствованный метод:
public bool getNewArticles(string fileSource)
{
SampleContext pContext = new SampleContext();
GetKeyWords kWordsGetter = new GetKeyWords();
string head;
string syn;
string link;
string date;
string keyW;
string chanelName;
string[] sources =
{
"http://www.interfax.ru/rss.asp",
"http://www.mk.ru/rss/politics/index.xml"
};
try
{
XmlDocument doc = new XmlDocument();
XmlNodeList nodeList;
XmlNode root;
//string fileSource = "http://www.interfax.ru/rss.asp";
//foreach (string fileSource in sources)
{
doc.Load(fileSource);
root = doc.DocumentElement;
nodeList = root.ChildNodes;
foreach (XmlNode chanel in nodeList)
{
foreach (XmlNode chanel_item in chanel)
{
if (chanel_item.Name == "title")
{
chanelName = chanel_item.InnerText;
}
if (chanel_item.Name == "item")
{
XmlNodeList itemsList = chanel_item.ChildNodes;
Console.WriteLine(5);
foreach (XmlNode item in itemsList)
{
Console.WriteLine(6);
if (item.Name == "title")
{
head = item.InnerText;
keyW = kWordsGetter.ToKWStr(head);
Console.WriteLine(head);
}
if (item.Name == "link")
{
link = item.InnerText;
Console.WriteLine(link);
}
if (item.Name == "description")
{
Console.WriteLine(9);
syn = item.InnerText;
}
if (item.Name == "pubDate")
{
Console.WriteLine(10);
date = item.InnerText;
}
if (item.Name == "category" & (item.InnerText == "В мире"
|| item.InnerText == "В России" || item.InnerText == "Политика"))
{
Console.WriteLine(7);
}
else
break;
pContext.pArticles.Add(new DB.PoliticsArticles()
{
header = head,
link = link,
synopsis = syn,
keyWords = keyW,
dateTime = Convert.ToDateTime(date),
source = chanelName
});
pContext.SaveChanges();
}
}
}
}
}
return true;
}
catch (Exception ex)
{
return false;
}
}
Выдача такая:
if работает. Проблема с циклом.
Если это не политическая новость - Вы просто выходите из цикла, обрабатывающего внутренние ноды item'а.
Замените break на continue. Это не даст выполнится коду добавления в базу, но не прекратит обработку списка.
Оператор break завершает выполнение ближайшего оператора внешнего цикла или switch, в котором он находится. Управление передается оператору, который расположен после завершенного оператора.
Оператор continue передает управление следующей итерации вложенного оператора while, do, for или foreach, в котором она встречается.
Ну и операнд "и" в C# пишется как &&, а не как &.
P.S. И вынесите добавление в базу из foreach. Перед добавлением нужно заполнить все свойства.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости