Mit dem Html Agility Pack Content zwischen zwei HTML-Tags abrufen

.net c# html-agility-pack

Frage

Wir haben ein absolut umfangreiches Hilfedokument, das in Word erstellt wurde, und es wurde verwendet, um ein noch massiveres und unwürdigeres HTM-Dokument zu erstellen. Mit C # und dieser Bibliothek möchte ich nur einen Abschnitt dieser Datei an einem beliebigen Punkt in meiner Anwendung abrufen und anzeigen. Abschnitte sind wie folgt aufgeteilt:

<!--logical section starts here -->
<div>
<h1><span style='mso-spacerun:yes'></span><a name="_Toc325456104">Section A</a></h1>
</div>
 <div> Lots of unnecessary markup for simple formatting... </div>
 .....
<!--logical section ends here -->

<div>
<h1><span style='mso-spacerun:yes'></span><a name="_Toc325456104">Section B</a></h1>
</div>

Logischerweise gibt es ein H1 mit einem Abschnittsnamen in einem a Tag. Ich möchte alles aus dem äußeren mit div auswählen, bis ich auf ein anderes h1 und dieses div ausschließe.

  • Jeder Abschnittsname befindet sich in einem <a> -Tag unter einem h1 das mehrere <a> Elemente enthält (jeweils etwa 6).
  • Der logische Abschnitt ist mit Kommentaren markiert
  • Diese Kommentare sind im aktuellen Dokument nicht vorhanden

Mein Versuch:

<!--logical section starts here -->
<div>
<h1><span style='mso-spacerun:yes'></span><a name="_Toc325456104">Section A</a></h1>
</div>
 <div> Lots of unnecessary markup for simple formatting... </div>
 .....
<!--logical section ends here -->

<div>
<h1><span style='mso-spacerun:yes'></span><a name="_Toc325456104">Section B</a></h1>
</div>

Ich konnte keine Dokumentation dazu finden, ich weiß nicht, wie ich von meinem Startknoten zum nächsten h1-Element gelangen kann. Irgendwelche Vorschläge würden geschätzt werden.

Akzeptierte Antwort

Ich denke, das wird es tun, obwohl angenommen wird, dass H1-Tags nur in Abschnittsköpfen erscheinen. Wenn dies nicht der Fall ist, können Sie ein Wo auf den Nachkommen hinzufügen, um nach anderen Filtern auf allen gefundenen H1-Knoten zu suchen. Beachten Sie, dass dies alle Geschwister des gefundenen Div enthält, bis es zum nächsten mit einem Sektionsnamen kommt.

private List<HtmlNode> GetSection(HtmlDocument helpDocument, string SectionName)
{
    HtmlNode startNode = helpDocument.DocumentNode.Descendants("div").Where(d => d.InnerText.Equals(SectionName, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
    if (startNode == null)
        return null; // section not found

    List<HtmlNode> section = new List<HtmlNode>();
    HtmlNode sibling = startNode.NextSibling;
    while (sibling != null && sibling.Descendants("h1").Count() <= 0)
    {
        section.Add(sibling);
        sibling = sibling.NextSibling;
    }

    return section;
}

Beliebte Antwort

Also, was Sie wirklich wollen, ist das Div um den h1-Tag? Wenn ja, dann sollte das funktionieren.

helpDocument.DocumentNode.SelectSingleNode("//h1/a[contains(@name, '"+sectionName+"')]/ancestor::div");

Funktioniert auch mit SelectNodes abhängig von Ihrem HTML. So was:

helpDocument.DocumentNode.SelectSingleNode("//h1/a[contains(@name, '"+sectionName+"')]/ancestor::div");

Oh, und während ich dies testete, bemerkte ich, dass das Ding, das nicht für mich funktionierte, der Punkt in der contains-Methode war, sobald ich es zum name-Attribut ändere, funktioniert alles gut.




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum