htmlagilitypack文本節點的父級是select而不是option?

html-agility-pack

使用htmlagility,我在一個由select組成的dom結構中搜索文本節點。

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

那些節點父母似乎是

<select>

而不是

<option>

為什麼?

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

一般承認的答案

那是因為默認情況下HtmlAgilityPack會關閉<option>標籤 。 HAP看到你的HTML是這樣的:

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

並且如上面的鏈接問題所述,您可以在啟動HtmlDocument之前通過調用以下行來更改該行為:

HtmlNode.ElementsFlags.Remove("option");

熱門答案

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

你可以試試這個。

在圖書館,它有這樣的。你需要刪除它。默認情況下,AgilityPack設置為將選項標記視為空。

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


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因