我有这个代码尝试从主节点集合中选择子节点
Dim items As HtmlNodeCollection = doc.DocumentNode.SelectNodes("//channel/item")
For Each item In items
link = item.SelectSingleNode("//link")
title = item.SelectSingleNode("//title")
next
xml是
<rss version="2.0">
<channel>
<title>title title</title>
<link>http://www.link.com</link>
<description>long decription</description>
<item>
<title>title title</title>
<link>http://www.link.com/</link>
<description> description</description>
</item>
<item>
<title>title title</title>
<link>http://www.link.com/</link>
<description> description</description>
</item>
<item>
<title>title title</title>
<link>http://www.link.com/</link>
<description> description</description>
</item>
</channel>
</rss>
但是我没有在每个项目的项目下获得适当的节点标题和链接。 我在哪里弄错了?
我本来可以做的
Dim links As HtmlNodeCollection = doc.DocumentNode.SelectNodes("//channel/item/link")
Dim titles As HtmlNodeCollection = doc.DocumentNode.SelectNodes("//channel/item/title")
但我需要每个项目的链接和标题
答案 0 :(得分:1)
对我来说就像是HtmlAgilityPack中的一个错误。我遇到的问题只是检索InnerText
元素的link
而不是其他元素。对于那个,文本被发现是它的兄弟,至少不是孩子。
无论如何,这不会是HtmlAgilityPack中遇到的第一个bug,所以我们应该忍受它:)。
<强>替代:强>
使用XmlDocument
,因为此处不涉及HTML。这是一个XML。
static void Main(string[] args)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(ConsoleApplication3.Properties.Settings.Default.RSS);
var items = xmlDoc.SelectNodes("//channel/item");
foreach (var item in items)
{
XmlNode node = (XmlNode)item;
var link = node.SelectSingleNode("//link");
var title = node.SelectSingleNode("//title");
if (link != null)
{
Console.WriteLine(link.InnerText);
}
if (title != null)
{
Console.WriteLine(title.InnerText);
}
}
Console.ReadKey();
}
<强>输出:强>
标题标题
标题标题
标题标题