Как я могу получить все теги Sibling Ul? - PullRequest
0 голосов
/ 15 февраля 2012

Вот фрагмент кода HTML: от: http://www.sphere -light.com / совместимость / производитель / id / 4 /

<h3 class="my-subject">a</h3>

<ul class='ex'>....</ul>
<ul class='ex'>....</ul>
<ul class='ex'>....</ul>
<ul class='ex'>....</ul>
<ul class='ex'>....</ul>
<ul class='ex'>....</ul>

<h3 class="my-subject">b</h3>

<ul class='ex'>....</ul>
<ul class='ex'>....</ul>
<ul class='ex'>....</ul>
<ul class='ex'>....</ul>
<ul class='ex'>....</ul>
<ul class='ex'>....</ul>

Как я могу получить только 6 братьев и сестер ul.ex через <h3 class="my-subject">a</h3>

и получить следующие 6 ul через <h3 class="my-subject">b</h3>?

1 Ответ

1 голос
/ 16 февраля 2012

Поскольку количество тегов <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
}
...