En utilisant htmlagility, je recherche des nœuds de texte dans une structure dom composée d’une sélection.
<select>
<option>
one
</option>
<option>
two
</option>
</select>
Ces nœuds parents semblent être les
<select>
au lieu d'un
<option>
Pourquoi?
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);
}
}
}
C'est parce que HtmlAgilityPack supprime la <option>
par défaut . HAP voit votre code HTML comme ceci:
Console.WriteLine(doc.DocumentNode.OuterHtml);
//result :
//<select><option>one<option>two</select>
Et comme mentionné dans la question liée ci-dessus, vous pouvez modifier ce comportement en appelant la ligne suivante avant d'initier 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);
}
vous pouvez essayer avec ça.
Dans la bibliothèque, il a comme ceci. Vous devez l'enlever. Par défaut, AgilityPack est configuré pour traiter les balises d'option comme vides.
ElementsFlags.Add("option", HtmlElementFlag.Empty);