Используя htmlagility, я ищу текстовые узлы в структуре dom, состоящей из select.
<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);