使用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);
}
}
}
答案 0 :(得分:2)
[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);
答案 1 :(得分:1)
那是因为HtmlAgilityPack drop closing <option>
tag by default。 HAP会看到您的HTML:
Console.WriteLine(doc.DocumentNode.OuterHtml);
//result :
//<select><option>one<option>two</select>
正如上面链接问题所述,您可以在启动HtmlDocument
之前调用以下行来改变该行为:
HtmlNode.ElementsFlags.Remove("option");