CsQuery to parse a collection of li items

2019-03-29 22:40发布

问题:

Here's my code:

CQ dom = CQ.Create(htmlString);
var items = dom[".blog-accordion li"];

foreach (var li in items)
{
    var newTournament = false;
    var test = li["header h2"];
}

Inside the foreach loop li turns into a IDomObject variable and I can no longer drill down further into it.

Any suggestions? Here is the example HTML I'm trying to parse:

<ul>
  <li>
    <header>
      <h2>Test</h2>
    </header>
  </li>
  <li>
    <header>
      <h2>Test 2</h2>
    </header>
  </li>
  <li>
    <header>
      <h2>Test 3</h2>
    </header>
  </li>
</ul>

I need to grab the text of each h2 element.

回答1:

This is done in order to keep CsQuery consistent with jQuery which behaves the same way. You can convert it back to a CQ object by calling the .Cq() method as such

foreach (var li in items)
{
    var newTournament = false;
    var test = li.Cq().Find("header h2");
}

Or if you'd like more jQueryish syntax, the following also works:

foreach (var li in items)
{
    var newTournament = false;
    var test = CQ.Create(li)["header h2"];
}

Your code, could be re-factored to the following if you'd like:

var texts = CQ.Create(htmlString)[".blog-accordion li header h2"]
              .Select(x=>x.Cq().Text());