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