Ich verwende HTML Agility Pack, um ein Element auszuwählen und dieses Element und alles, was es enthält, aus einer HTML-Zeichenfolge zurückzugeben, die geladen wird. Beim Testen meines Codes habe ich ihn gegen das select-Tag-Beispiel von w3schools ausgeführt:
<select name="cars">
<option value="volvo">Volvo XC90</option>
<option value="saab">Saab 95</option>
<option value="mercedes">Mercedes SLK</option>
<option value="audi">Audi TT</option>
</select>
Wenn ich versuche, das mit HTML-Agilitätspaket auszuwählen und zurückzugeben, bekomme ich (Option, die Tags entfernt):
<select name="cars">
<option value="volvo">Volvo XC90
<option value="saab">Saab 95
<option value="mercedes">Mercedes SLK
<option value="audi">Audi TT
</select>
Also habe ich hier ein wenig gesucht und eine Anweisung zum Hinzufügen der Zeile gefunden: HtmlNode.ElementsFlags.Remove ("option");
Ich habe das getan, und jetzt bekomme ich (der Optionstext wird außerhalb der Options-Tags verschoben):
<select name="cars">
<option value="volvo"></option>Volvo XC90
<option value="saab"></option>Saab 95
<option value="mercedes"></option>Mercedes SLK
<option value="audi"></option>Audi TT
</select>
Ich möchte, dass die Ausgabe dem ursprünglichen HTML entspricht. Was muss ich tun, um das zu bekommen?
Ich habe auch mit den OptionWriteEmptyNodes gespielt, als ich mit Input-Tags getestet habe, deren Selbst-Closing entfernt wurde. Das Hinzufügen dieser Option schien das zu beheben. Ich habe es jetzt auskommentiert, um sicherzustellen, dass es dieses Problem nicht beeinträchtigt.
Das ist mein .NET C # -Code:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(content);
HtmlNode.ElementsFlags.Remove("option"); // otherwise, the closing tag is removed.
//doc.OptionWriteEmptyNodes = true;
var nodes = doc.DocumentNode.SelectNodes("//select");
if (nodes == null)
return "Not found";
else
return nodes[0].OuterHtml;
Sie müssen das ElementsFlag-Feld für das Options-Tag festlegen, damit es funktioniert
HtmlNode.ElementsFlags["option"] = HtmlElementFlag.Closed;
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
welches Ihren ursprünglichen HTML Code zurückgeben sollte.
Ich glaube, der Grund dafür, dass sich HtmlAgilityPack so verhält, ist, dass das <option>
-Tag ironischerweise ein optionales Tag in HTML ist, das kein schließendes Tag benötigt.
Aus der Dokumentation der HtmlNode
Klasse und ihrem Feld ElementsFlags
:
Ruft eine Sammlung von Flags ab, die bestimmte Verhalten für bestimmte Elementknoten definieren. Die Tabelle enthält eine DictionaryEntry-Liste mit dem Tagnamen in Kleinbuchstaben als Schlüssel und eine Kombination aus HtmlElementFlags als Wert.
Weitere Einblicke in die HtmlElementFlag
Enums zeigen dies:
Leer - Der Knoten ist leer. META oder IMG sind Beispiele für solche Knoten. Closed - Der Knoten wird beim Parsen automatisch geschlossen.
Sie können den Quellcode für die Klasse HtmlNode anzeigen, um zu sehen, welche anderen Tags als "spezifisch" gelten.