如何为xpath seach设置上下文

时间:2015-12-31 21:41:15

标签: c# xpath html-agility-pack

我有一个ajax请求到服务器,它返回一个html页面,如下所示:\

<div class="item">
    <div class="name">
        <b>Name of the item</b>
    </div>

    <div class="itemProp">
        <input type="hidden" name="index" value="88">
    </div>
</div>

对于与我的请求匹配的许多项目,这仍在继续。 现在我希望能够获得项目的名称和索引值。

我做的是:

var itemCollection = doc.DocumentNode.SelectNodes("div[@class ='item']");
foreach (var item in itemCollection)
{
    Console.WriteLine("Name {0}",item.SelectSingleNode("//b").InnerText);
    Console.WriteLine("rdef index {0}", item.SelectSingleNode("//input[@name='index']").GetAttributeValue("value","Not Found"));
}

但我正在搜索标签的整个文档,因此每次只返回第一个。

我的问题是,我如何设置一个上下文来搜索Xpath和HtmlAgilityPack,所以当我在for循环时,它只会搜索项目子项内的b标签,而不是整个文档。 此外,如果有更好的方法,我可以接受建议!

2 个答案:

答案 0 :(得分:0)

使用.//foo

Console.WriteLine("Name {0}",item.SelectSingleNode(".//b").InnerText);

与其他相对路径相同,例如

Console.WriteLine("rdef index {0}", item.SelectSingleNode(".//input[@name='index']").GetAttributeValue("value","Not Found"));

答案 1 :(得分:0)

您可以使用XML Linq

执行此操作
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication63
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml =
                "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
                "<Root>" +
                  "<div class=\"item\">" +
                    "<div class=\"name\">" +
                      "<b>Name of the item</b>" +
                    "</div>" +
                    "<div class=\"itemProp\">" +
                      "<input type=\"hidden\" name=\"index\" value=\"88\"/>" +
                    "</div>" +
                  "</div>" +
                  "<div class=\"item\">" +
                    "<div class=\"name\">" +
                      "<b>Name of the item</b>" +
                    "</div>" +
                    "<div class=\"itemProp\">" +
                      "<input type=\"hidden\" name=\"index\" value=\"88\"/>" +
                    "</div>" +
                  "</div>" +
                "</Root>";

            XDocument doc = XDocument.Parse(xml);
            var results = doc.Descendants().Where(x => (x.Name.LocalName == "div") && (x.Attribute("class") != null) && x.Attribute("class").Value == "item").Select(y => new {
                name = y.Descendants("b").FirstOrDefault().Value,
                value = y.Descendants("input").FirstOrDefault().Attribute("value").Value
            }).ToList();
        }
    }
}