如何为 xpath 搜索设置上下文

How to set a context for xpath seach

我有一个 ajax 请求到服务器,其中 returns 一个 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"));
}

但是我在整个文档中搜索标签,所以它 returns 每次都只搜索第一个。

我的问题是,我如何设置上下文以使用 Xpath 和 HtmlAgilityPack 进行搜索,所以当我进入 for 循环时,它只会搜索项目子项内的 b 标记,而不是整个文档。 另外,如果有更好的方法,我愿意接受建议!

使用.//foo:

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

其他相对路径也一样,例如

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

您可以使用 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();
        }
    }
}