Comment obtenir tous les éléments d'entrée dans un formulaire avec HtmlAgilityPack sans obtenir d'erreur de référence null

c# html html-agility-pack parsing

Question

Exemple 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>

Code de test:

 <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>

L'instruction doc.GetElementbyId("form2").SelectNodes(".//input") me donne une référence null.

Quelque chose que j'ai mal fait? Merci.

Réponse acceptée

Vous pouvez faire ce qui suit:

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);
    }
}

Par défaut, HTML Agility Pack analyse les formulaires en tant que nœud vide, car ils sont autorisés à chevaucher d'autres éléments HTML. La première ligne, ( HtmlNode.ElementsFlags.Remove("form"); ) désactive ce comportement, ce qui vous permet d’obtenir les éléments d’entrée dans le second formulaire.

Mise à jour: Exemple de chevauchement d'éléments de formulaire:

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);
    }
}

L'élément commence à l'intérieur d'une table mais est fermé à l'extérieur de l'élément table. Ceci est autorisé dans la spécification HTML et HTML Agility Pack doit le gérer.


Réponse populaire

Il suffit de les mettre en tableau:

HtmlNodeCollection resultCollection = doc.DocumentNode.SelectNodes("//*[@type='text']");



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