我有一个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标签,而不是整个文档。 此外,如果有更好的方法,我可以接受建议!
答案 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();
}
}
}