Le parent du noeud text htmlagilitypack est select au lieu de option?

html-agility-pack

Question

En utilisant htmlagility, je recherche des nœuds de texte dans une structure dom composée d’une sélection.

<select>
  <option>
    one
  </option>
  <option>
    two
  </option>
</select>

Ces nœuds parents semblent être les

<select>

au lieu d'un

<option>

Pourquoi?

using System.IO;
using System.Linq;
using HtmlAgilityPack;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Foo.Test
{
  [TestClass]
  public class HtmlAgilityTest
  {
    [TestMethod]
    public void TestTraverseTextNodesInSelect()
    {
      var html = "<select><option>one</option><option>two</option></select>";

      var doc = new HtmlDocument();
      doc.Load(new StringReader(html));

      var elements = doc.DocumentNode.Descendants().Where(n=>n.Name == "#text");

      Assert.AreEqual(2, elements.Count());
      Assert.AreEqual("select", elements.ElementAt(0).ParentNode.Name);
      Assert.AreEqual("select", elements.ElementAt(1).ParentNode.Name);
    }
  }
}

Réponse acceptée

C'est parce que HtmlAgilityPack supprime la <option> par défaut . HAP voit votre code HTML comme ceci:

Console.WriteLine(doc.DocumentNode.OuterHtml);
//result :
//<select><option>one<option>two</select>

Et comme mentionné dans la question liée ci-dessus, vous pouvez modifier ce comportement en appelant la ligne suivante avant d'initier HtmlDocument :

HtmlNode.ElementsFlags.Remove("option");

Réponse populaire

   [TestMethod]
    public void TestTraverseTextNodesInSelect()
    {
      HtmlNode.ElementsFlags.Remove("option");
      var html = "<select><option>one</option><option>two</option></select>";

      var doc = new HtmlDocument();
      doc.Load(new StringReader(html));

      var elements = doc.DocumentNode.Descendants().Where(n=>n.Name == "#text");

      Assert.AreEqual(2, elements.Count());
      Assert.AreEqual("select", elements.ElementAt(0).ParentNode.Name);
      Assert.AreEqual("select", elements.ElementAt(1).ParentNode.Name);
    }

vous pouvez essayer avec ça.

Dans la bibliothèque, il a comme ceci. Vous devez l'enlever. Par défaut, AgilityPack est configuré pour traiter les balises d'option comme vides.

ElementsFlags.Add("option", HtmlElementFlag.Empty);


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