Obtenir les champs d'un formulaire dans htmlagilitypack

html-agility-pack

Question

Je veux obtenir les données pour un formulaire alors j'ai écrit le ci-dessous. Ça n'a pas marché

doc.DocumentNode.SelectNodes("//form[@name='F1']//input[@name]");

Le diviser en deux étapes a fait

var node = doc.DocumentNode.SelectSingleNode("//form[@name='F1']");
var nodes = node.SelectNodes("//input[@name]");

Cependant, je reçois les données du fichier HTML entier plutôt que du nœud / formulaire, ce qui est inattendu. Comment puis-je obtenir les résultats de ce formulaire uniquement? J'ai essayé /input[@name] et .//input[@name] qui m'a donné la valeur null

Réponse populaire

Il semble que ce soit le comportement par défaut pour l'analyse des balises <form> dans Html Agility Pack. Comme ils l'ont dit ici :

FORM est traité comme ceci parce que beaucoup de pages HTML avaient des formulaires qui se chevauchaient, car c'était en fait une fonctionnalité (puissante) du HTML original. Maintenant que XML et XHTML existent, tout le monde suppose que le chevauchement est une erreur, mais ce n’est pas le cas (en HTML 3.2).

Vous pouvez le changer en utilisant:

HtmlNode.ElementsFlags.Remove("form");

et votre expression "//form[@name='F1']//input[@name]" devrait fonctionner. Ou changez la deuxième expression en ".//input[@name]" et cela devrait également fonctionner:

var node = doc.DocumentNode.SelectSingleNode("//form[@name='F1']");
var nodes = node.SelectNodes(".//input[@name]");


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi