Frage

Ich bin mit HtmlAgilityPack. Ich erstelle ein Htmldocument und loadhtml mit der folgenden Zeichenfolge:

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select>

Dies hat einige unerwartete Dinge. Erstens gibt es zwei Parser-Fehler, EndTagNotRequired. Zweitens hat der Wahlknoten 4 Kinder - zwei für die Option Tags und zwei weitere für den inneren Text der Option-Tags. Last, die Outerhtml ist wie folgt:

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One<option value="2">Two</select>

Also im Grunde ist es die Entscheidung für mich, die schließenden Tags zu den Optionen fallen. Lassen Sie uns für einen Augenblick beiseite lassen, ob es angemessen und wünschenswert ist, das zu tun. Ich verwende HtmlAgilityPack HTML-Generierung Code zu testen, so dass ich nicht will, dass es eine Entscheidung für mich machen oder Fehler geben, wenn die HTML wirklich fehlerhaft ist. Gibt es eine Möglichkeit, es zu machen verhalten, wie ich will? Ich habe versucht, einige der Optionen für Htmldocument Einstellung, insbesondere:

 doc.OptionAutoCloseOnEnd = false;
 doc.OptionCheckSyntax = false;
 doc.OptionFixNestedTags = false;

Das funktioniert nicht. Wenn HtmlAgilityPack nicht tun kann, was ich will, kann man etwas empfehlen, kann?

War es hilfreich?

Lösung

Die exakt gleichen Fehler werden auf der HAP Homepage der Diskussion berichtet, aber es sieht aus wie keine aussagekräftigen Behebungen für das Projekt in ein paar Jahren gemacht worden. Nicht ermutigend.

Eine schnelle Durchsuchen der Quelle schlägt der Fehler durch Kommentare aus der Leitung 92 von HtmlNode.cs fixierbar sein könnte:

// they sometimes contain, and sometimes they don 't...
ElementsFlags.Add("option", HtmlElementFlag.Empty);

(Eigentlich nein, sie immer Beschriftungstext enthalten, obwohl eine leere Zeichenfolge gilt auch Text sein würde. Ein unvorsichtiger Autor könnte den End-Tag weglassen, aber dann das gilt für jedes Element.)

Hinzufügen

Eine äquivalente Lösung ruft HtmlNode.ElementsFlags.Remove("option"); vor jeder Verwendung von liberary (ohne Notwendigkeit, die liberary Quellcode zu ändern)

Andere Tipps

Es scheint, dass es aus irgendeinem Grund nicht die Option-Tag als „generic“ Tag, für XHTML Compliance zu analysieren, aber dies eine echte Nervensäge sein kann.

ist mein Vorschlag eine ganze-string-ersetzen und ändern Sie alle "Option" Tags zu tun, um "my_option" Tags, auf diese Weise Sie:

  1. Sie müssen nicht die Quelle der Bibliothek ändern (und kann es später ein Upgrade).
  2. Kann analysieren, wie Sie normalerweise tun würde.

Der Original-Beitrag auf HtmlAgilityPack Forum finden Sie unter: http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top