Kann HTMLAgility Pack nicht geschlossene Tags hinterlassen?

c# html-agility-pack

Frage

Ich muss eine HTML-Zeichenfolge wie folgt analysieren:

<widget attribute="1">
  <header>
    <table>
  </header>
  <item>
    <tr><td>content</td></tr>
  </item>
  <footer>
    </table>
  </footer>
</widget>

Ich verwende Html Agility Pack und kann alle "Widgets" finden:

HtmlDocument doc = new HtmlDocument();
doc.OptionAutoCloseOnEnd = false;
doc.OptionOutputAsXml = false;
doc.LoadHtml(htmlString); 
HtmlNodeCollection widgets = doc.DocumentNode.SelectNodes("//widget");

Mein Problem ist, wenn ich versuche, alle childnodes des Widgetknotens zu erhalten. HTMLAgility schließt automatisch alle meine Umbauten, also kann ich Kopf-, Gegenstand- und Fußnotenknoten nicht richtig erhalten. Die von Agility generierte Ausgabe ist:

<header>
    <table>
</table></header>
<item>
    <tr>
        <td><p>Riga n.1</p></td>
    </tr>
</item>
<footer>

</footer>

Es schließt das Tag "Tabelle" in der Kopfzeile und blendet das Tag "Tabelle" in der Fußzeile aus. Gibt es eine Möglichkeit, diese Tags nicht geschlossen zu lassen? Ich habe versucht, die Dokumentation über die Logik der LoadHtml-Methode zu durchsuchen, aber ich habe nichts gefunden. Ich denke, ich muss mit Optionen spielen.

Kannst du mir helfen?

Beliebte Antwort

Html Agility Pack unterstützt im Allgemeinen keine überlappenden Tags nach Design. Sie können es jedoch so einstellen:

HtmlDocument doc = new HtmlDocument();
HtmlNode.ElementsFlags.Add("table", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);
doc.LoadHtml(htmlString); 

In diesem Fall weisen Sie die Bibliothek an, TABLE als überlappendes Tag zu behandeln. Als Randbemerkung ist FORM der einzige TAG, der standardmäßig als überlappendes Tag definiert ist (siehe den Grund hier: HtmlAgilityPack - Verschließt sich <form> aus irgendeinem Grund? ).

Dies ist jedoch kein kostenloses Mittagessen.

Das bedeutet, dass die Bibliothek nun erkennt, was sich in der Tabelle befindet, und Tabellen-Tags als reines Textelement schließt. Daher sind alle Tags in der geparsten Tabelle nicht programmatisch zugänglich, Sie sehen sie nicht im DOM, Sie sehen sie nicht mit XPATH usw., aber das reicht vielleicht für Ihre Bedürfnisse.




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