我在Html Agility Pack中使用XPath查询时无法检索查询与单个元素上的多个值匹配的属性值。
我有以下测试代码:
string html = @"
<html>
<body>
<img height='5' src='http://bar1.com/foo.png' lowsrc='http://bar2.com/foo.png' />
<img src='http://bar3.com/foo.png' />
</body>
</html>";
string xPathQuery = "//img/@src | //img/@lowsrc";
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html);
IEnumerable<string> values = htmlDoc.CreateNavigator()
.Select(xPathQuery)
.OfType<HtmlNodeNavigator>()
.Select(x => x.Value);
我希望结果是:
http://bar1.com/foo.png
http://bar2.com/foo.png
http://bar3.com/foo.png
但是,我得到了:
http://bar1.com/foo.png
http://bar3.com/foo.png
注意,缺少第一个img元素中的第二个属性。
有没有办法使用单个XPath查询实现此目的?我知道我可以使用XPath来查找所有img
元素,然后直接读取属性,但返回所有值的XPath查询会更方便。
答案 0 :(得分:0)
看起来Html Agility Pack不支持属性选择http://htmlagilitypack.codeplex.com/discussions/1720
这样可以解决问题:
string xPathQuery = "//img[@src or @lowsrc]";
var values = htmlDoc.DocumentNode.SelectNodes(xPathQuery)
.SelectMany(n => new[] {n.Attributes["src"], n.Attributes["lowsrc"]})
.Where(n => n != null)
.Select(a => a.Value);