如何为 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();
}
}
}
我有一个 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();
}
}
}