Ich verwende HtmlAgilityPack. Ich erstelle ein HtmlDocument und LoadHtml mit der folgenden Zeichenkette:
<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select>
Das macht einige unerwartete Dinge. Erstens gibt es zwei Parserfehler, EndTagNotRequired. Zweitens hat der Auswahlknoten 4 Kinder - zwei für die Optionstags und zwei weitere für den inneren Text der Optionstags. Zuletzt ist OuterHtml wie folgt:
<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One<option value="2">Two</select>
Im Grunde ist es für mich entscheidend, die abschließenden Tags auf die Optionen zu setzen. Lassen Sie uns für einen Moment beiseite lassen, ob es richtig und wünschenswert ist, das zu tun. Ich verwende HtmlAgilityPack, um HTML-Generierungscode zu testen, also möchte ich nicht, dass es irgendeine Entscheidung für mich trifft oder irgendwelche Fehler gibt, es sei denn, der HTML-Code ist wirklich fehlerhaft. Gibt es eine Möglichkeit, es so zu verhalten, wie ich es möchte? Ich habe versucht, einige der Optionen für HtmlDocument, insbesondere:
doc.OptionAutoCloseOnEnd = false;
doc.OptionCheckSyntax = false;
doc.OptionFixNestedTags = false;
Das funktioniert nicht. Wenn HtmlAgilityPack nicht tun kann, was ich will, können Sie etwas empfehlen, das kann?
Der genau gleiche Fehler wird auf der Diskussion der HAP-Homepage berichtet, aber es sieht so aus, als ob in einigen Jahren keine sinnvollen Korrekturen am Projekt vorgenommen wurden. Nicht ermutigend.
Ein schnelles Durchsuchen der Quelle deutet darauf hin, dass der Fehler möglicherweise behoben werden kann, indem Zeile 92 von HtmlNode.cs kommentiert wird:
// they sometimes contain, and sometimes they don 't...
ElementsFlags.Add("option", HtmlElementFlag.Empty);
(Eigentlich nein, sie enthalten immer Beschriftungstext, obwohl eine leere Zeichenfolge auch gültiger Text wäre. Ein unvorsichtiger Autor könnte das End-Tag weglassen, aber dann gilt das für jedes Element.)
HINZUFÜGEN
Eine äquivalente Lösung ruft HtmlNode.ElementsFlags.Remove("option");
vor dem Gebrauch von liberary (ohne den Quellcode der Version ändern zu müssen)
Es scheint, dass es einen Grund gibt, das Option-Tag nicht als "generisches" Tag für die XHTML-Kompatibilität zu analysieren, dies kann jedoch ein echter Nackenschmerz sein.
Mein Vorschlag ist, eine ganze Zeichenfolge zu ersetzen und alle "Option" -Tags zu "my_option" -Tags zu ändern, so dass Sie:
Der ursprüngliche Beitrag im HtmlAgilityPack-Forum finden Sie unter: http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982