HtmlAgilityPack: Könnte jemand bitte genau erklären, was die Auswirkung des HtmlDocument OptionAutoCloseOnEnd auf true ist?

c# html-agility-pack

Frage

Die aktuelle Dokumentation sagt:

Definiert, ob das Schließen für nicht geschlossene Knoten am Ende oder direkt im Dokument erfolgen muss. Wenn Sie dies auf "true" setzen, kann sich tatsächlich ändern, wie Browser die Seite rendern. Standard ist falsch.

Entschuldigung, ich muss zugeben, dass ich diesen Absatz nicht verstehe. Speziell "am Ende" von was? Und was bedeutet "im Dokument" genau? Der Satz vor dem letzten klingt ominös. Wenn die Option auf "True" gesetzt ist und der HTML-Code korrekt formatiert ist, wird sich dies auf das Dokument auswirken?

Ich habe in den Quellcode geschaut, aber ich habe nicht verstanden, was passiert - der Code reagiert darauf, dass die Eigenschaft nicht auf "True" gesetzt ist. Siehe HtmlNode.cs und suche nach OptionAutoCloseOnEnd - Zeile 1707. Ich habe auch etwas funkigen Code in HtmlWeb.cs in den Zeilen 1113 und 1154 gefunden. Schade, dass der Quellcode-Browser keine Zeilennummern anzeigt, sondern auf der Seite nach OptionAutoCloseOnEnd sucht.

Könnten Sie bitte anhand eines Beispiels veranschaulichen, was diese Option bewirkt?

Ich verwende das HtmlAgilityPack, um etwas schlechtes HTML zu reparieren und den Seiteninhalt nach XML zu exportieren.

Ich stieß auf einige schlecht formatierte html - überlappende Tags. Hier ist der Ausschnitt:

<p>Blah bah
<P><STRONG>Some Text</STRONG><STRONG></p>
<UL>
<LI></STRONG>Item 1.</LI>
<LI>Item 2</LI>
<LI>Item 3</LI></UL>

Beachten Sie, dass das erste p-Tag nicht geschlossen ist und notieren Sie sich das überlappende STRONG-Tag.

Wenn ich OptionAutoCloseOnEnd setze, wird das irgendwie behoben. Ich versuche zu verstehen, was genau diese Eigenschaft in der Struktur des Dokuments auf true setzt.

Hier ist der C # -Code, den ich verwende:

HtmlDocument doc = new HtmlDocument();
doc.OptionOutputAsXml = true;
doc.OptionFixNestedTags = true;      
//  doc.OptionAutoCloseOnEnd = true;    
doc.LoadHtml(htmlText);

Vielen Dank!

Akzeptierte Antwort

Der aktuelle Code schließt die nicht geschlossenen Knoten immer unmittelbar vor dem Schließen des übergeordneten Knotens. Also der folgende Code

var doc = new HtmlDocument();
doc.LoadHtml("<x>hello<y>world</x>");
doc.Save(Console.Out);

gibt dies aus (das nicht geschlossene <y> ist geschlossen, bevor das übergeordnete <x> geschlossen ist)

<x>hello<y>world</y></x>

Ursprünglich sollte die Option, wenn sie gesetzt war, dies stattdessen erzeugen können (nicht für XML-Ausgabetypen):

<x>hello<y>world</x></y>

mit dem schließenden <y> am Ende des Dokuments (was das "Ende" bedeutet). Hinweis: In diesem Fall können Sie immer noch überlappende Elemente erhalten.

Diese Funktion (vielleicht nutzlos, das kann ich zugeben) war irgendwo in der Vergangenheit kaputt gegangen, ich weiß nicht warum.

Hinweis <p> Groß- / Kleinschreibung ist besonders, da sie standardmäßig von benutzerdefiniertem HtmlElementFlag bestimmt wird. So wird es in HtmlNode.cs deklariert:

ElementsFlags.Add("p", HtmlElementFlag.Empty | HtmlElementFlag.Closed);

Beliebte Antwort

Der bessere Weg, HtmlAgilityPack zu verwenden, wäre das programmatische Öffnen und Schließen von Tags, wo immer dies erforderlich ist.

 doc.OptionAutoCloseOnEnd = false;

Welche gibt Ihnen die erwartete Formatierung.

Andernfalls prüft die Bibliothek, ob alle Tags, die nicht geschlossen sind, geschlossen werden, und schließen sie, wo immer es sich für Ihren Code-Ausführungsfluss als geeignet erweist.



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