从单个元素中选择多个属性值

时间:2016-09-15 20:32:08

标签: html xpath html-agility-pack

我在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查询会更方便。

1 个答案:

答案 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);