Поскольку количество тегов <ul>
может варьироваться, вот несколько подходов, которые вы можете использовать.
Использование XPath:
var h3Xpath = "//h3[@class='my-subject']";
var query = doc.DocumentNode.SelectNodes(h3Xpath);
foreach (var h3 in query)
{
var value = h3.InnerText;
var ulXpathFmt = "following-sibling::ul[@class='ex' and " +
"preceding-sibling::h3[@class='my-subject'][1]='{0}']";
var uls = h3.SelectNodes(String.Format(ulXpathFmt, value));
// do something with the uls
}
Я бы вообще не делал все это с использованием только XPath, но смешивал бы и с использованием некоторых LINQ.
var h3Xpath = "//h3[@class='my-subject']";
var query = doc.DocumentNode.SelectNodes(h3Xpath);
foreach (var h3 in query)
{
var ulXpath = "following-sibling::*";
var uls = h3.SelectNodes(ulXpath)
.TakeWhile(tag => tag.Name == "ul" &&
tag.Attributes["class"].Value == "ex");
// do something with the uls
}