Il nodo padre del nodo di testo htmlagility è selezionato al posto dell'opzione?

html-agility-pack

Domanda

Usando htmlagility, sto cercando i nodi di testo in una struttura dom composta da una selezione.

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

Quei genitori dei nodi sembrano essere i

<select>

invece di un

<option>

Perché?

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

Risposta accettata

Questo perché HtmlAgilityPack interrompe la chiusura <option> per impostazione predefinita . HAP vede il tuo HTML in questo modo:

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

E come menzionato nella domanda collegata sopra, puoi modificare tale comportamento chiamando la seguente linea prima di iniziare l' HtmlDocument :

HtmlNode.ElementsFlags.Remove("option");

Risposta popolare

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

puoi provare con questo.

Nella biblioteca ha questo. Devi rimuoverlo. per impostazione predefinita, AgilityPack è impostato per trattare i tag di opzione come vuoti.

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


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché