Пишу новостной парсер. Был старый метод получения данных из 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
. Перед добавлением нужно заполнить все свойства.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Не знаю корректно ли задавать тут вопрос по конкретной библиотеке, но сильно не понимаю, поэтому пишуМожет кто сталкивался
Есть программа, вот её код
Пытаюсь написать макрос на шарпе под SolidWorksНиже -- неработающий участок кода