Ich habe gerade diesen Test geschrieben, um zu sehen, ob ich verrückt bin ...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HtmlAgilityPack;
namespace HtmlAgilityPackFormBug
{
class Program
{
static void Main(string[] args)
{
var doc = new HtmlDocument();
doc.LoadHtml(@"
<!DOCTYPE html>
<html>
<head>
<title>Form Test</title>
</head>
<body>
<form>
<input type=""text"" />
<input type=""reset"" />
<input type=""submit"" />
</form>
</body>
</html>
");
var body = doc.DocumentNode.SelectSingleNode("//body");
foreach (var node in body.ChildNodes.Where(n => n.NodeType == HtmlNodeType.Element))
Console.WriteLine(node.XPath);
Console.ReadLine();
}
}
}
Und es gibt aus:
/html[1]/body[1]/form[1]
/html[1]/body[1]/input[1]
/html[1]/body[1]/input[2]
/html[1]/body[1]/input[3]
Aber wenn ich <form>
zu <xxx>
ändere, gibt es mir:
/html[1]/body[1]/xxx[1]
(So wie es sollte). So ... es sieht so aus, als ob diese Eingabeelemente nicht innerhalb des Formulars enthalten sind, sondern direkt im Körper, als ob sich die <form>
gerade sofort geschlossen hätte. Was ist damit? Ist das ein Fehler?
Wenn ich durch die Quelle schaue, sehe ich:
ElementsFlags.Add("form", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);
Es hat die "leere" Flagge, wie META und IMG. Warum?? Formulare sollten definitiv nicht leer sein.
Dies wird auch in diesem Arbeitselement gemeldet. Es enthält eine vorgeschlagene Problemumgehung von DarthObiwan.
Sie können dies ohne Neukompilierung ändern. Die ElementFlags-Liste ist eine statische Eigenschaft für die HtmlNode-Klasse. Es kann mit entfernt werden
HtmlNode.ElementsFlags.Remove("form");
bevor Sie das Dokument laden
Da ich der ursprüngliche HAP-Autor bin, kann ich erklären, warum es als leer markiert ist :)
Denn als HAP im Jahr 2000 entwickelt wurde, war HTML 3.2 der Standard. Ihnen ist wahrscheinlich bewusst, dass sich Tags in HTML perfekt überlappen können. Das heißt: <b>bold<i>italic and bold</b>italic</i>
( fett kursiv und fett kursiv) wird von allen Browsern unterstützt (obwohl es nicht offiziell in der HTML-Spezifikation ist). Und das FORM-Tag kann sich auch perfekt überlappen.
Da HAP entwickelt wurde, um jeden HTML-Inhalt zu handhaben, anstatt die meisten Seiten zu brechen, die Sie zu diesem Zeitpunkt finden konnten, haben wir uns entschieden, überlappende Tags als EMPTY (mit der ElementFlags-Eigenschaft) zu behandeln:
Das einzige, was Sie nicht tun können, ist, mit ihnen mit der API zu arbeiten, mit dem Baummodell, noch mit XSL oder irgendetwas Programmatischem. Heute, mit XHTML / XML fast überall, klingt das seltsam, aber deshalb habe ich die ElementFlags erstellt :)