Beispiel HTML:
<html><body>
<form id="form1">
<input name="foo1" value="bar1" />
<!-- Other elements -->
</form>
<form id="form2">
<input name="foo2" value="bar2" />
<!-- Other elements -->
</form>
</body></html>
Testcode:
HtmlDocument doc = new HtmlDocument();
doc.Load(@"D:\test.html");
foreach (HtmlNode node in doc.GetElementbyId("form2").SelectNodes(".//input"))
{
Console.WriteLine(node.Attributes["value"].Value);
}
Die Anweisung doc.GetElementbyId("form2").SelectNodes(".//input")
gibt mir eine doc.GetElementbyId("form2").SelectNodes(".//input")
.
Alles, was ich falsch gemacht habe? Vielen Dank.
Sie können Folgendes tun:
HtmlNode.ElementsFlags.Remove("form");
HtmlDocument doc = new HtmlDocument();
doc.Load(@"D:\test.html");
HtmlNode secondForm = doc.GetElementbyId("form2");
foreach (HtmlNode node in secondForm.Elements("input"))
{
HtmlAttribute valueAttribute = node.Attributes["value"];
if (valueAttribute != null)
{
Console.WriteLine(valueAttribute.Value);
}
}
Standardmäßig analysiert HTML Agility Pack Formulare als leere Knoten, da sie andere HTML-Elemente überlappen dürfen. Die erste Zeile ( HtmlNode.ElementsFlags.Remove("form");
) deaktiviert dieses Verhalten, sodass Sie die Eingabeelemente innerhalb des zweiten Formulars HtmlNode.ElementsFlags.Remove("form");
.
Update: Beispiel für Formularelemente überlappen:
<table>
<form>
<!-- Other elements -->
</table>
</form>
Das Element beginnt in einer Tabelle, wird jedoch außerhalb des Tabellenelements geschlossen. Dies ist in der HTML-Spezifikation erlaubt und HTML Agility Pack muss damit umgehen.
Holen Sie sie einfach in Array:
HtmlNodeCollection resultCollection = doc.DocumentNode.SelectNodes("//*[@type='text']");