Texte intérieur du nœud ignorant le texte intérieur des enfants

c# html-agility-pack xpath

Question

Pardonnez-moi si cela semble trop simple pour être demandé ici, mais comme c'est mon tout premier jour avec html-agility-pack, je suis incapable de trouver un moyen de sélectionner le texte interne d'un noeud qui est l'enfant direct du noeud et en ignorant le texte interne des nœuds enfants.

Par exemple

<div id="div1">
   <div class="h1"> this needs to be selected
   <small> and not this</small>
   </div>
</div>

actuellement j'essaye cette

HtmlDocument page = new HtmlWeb().Load(url);
var s = page.DocumentNode.SelectSingleNode("//div[@id='div1']//div[@class='h1']");
string selText = s.innerText;

qui retourne tout le texte (par exemple, il faut le sélectionner et non cela). Aucune suggestion??

Réponse acceptée

Vous pouvez utiliser l'option /text() pour obtenir tous les nœuds de texte directement sous une balise spécifique. Si vous avez seulement besoin du premier, ajoutez [1] à celui-ci:

page.LoadHtml(text);
var s = page.DocumentNode.SelectSingleNode("//div[@id='div1']//div[@class='h1']/text()[1]");
string selText = s.InnerText; 

Réponse populaire

La div peut éventuellement avoir plusieurs nœuds de texte s'il y a du texte avant et après ses enfants. Comme je l’ai indiqué de manière similaire ici , je pense que la meilleure façon d’obtenir tout le contenu texte direct d’un nœud est de faire quelque chose comme:

HtmlDocument page = new HtmlWeb().Load(url);
var nodes = page.DocumentNode.SelectNodes("//div[@id='div1']//div[@class='h1']/text()");

StringBuilder sb  = new StringBuilder();
foreach(var node in nodes)
{
   sb.Append(node.InnerText);
}

string content = sb.ToString();


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow