从集合htmlagilitypack中选择childenode

时间:2012-07-01 13:11:54

标签: .net html-parsing html-agility-pack

我有这个代码尝试从主节点集合中选择子节点

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")

但我需要每个项目的链接和标题

1 个答案:

答案 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();
}

<强>输出:

  

http://www.link.com

     

标题标题

     

http://www.link.com

     

标题标题

     

http://www.link.com

     

标题标题