Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 节点的内部文本忽略子节点的内部文本_C#_Xpath_Html Agility Pack - Fatal编程技术网

C# 节点的内部文本忽略子节点的内部文本

C# 节点的内部文本忽略子节点的内部文本,c#,xpath,html-agility-pack,C#,Xpath,Html Agility Pack,请原谅,如果这里的问题听起来太简单,但由于这是我使用html agility pack的第一天,我无法找到一种方法来选择节点的内部文本,它是节点的直接子节点,而忽略子节点的内部文本 比如说 <div id="div1"> <div class="h1"> this needs to be selected <small> and not this</small> </div> </div> 返回整个文本(

请原谅,如果这里的问题听起来太简单,但由于这是我使用html agility pack的第一天,我无法找到一种方法来选择节点的内部文本,它是节点的直接子节点,而忽略子节点的内部文本

比如说

<div id="div1">
   <div class="h1"> this needs to be selected
   <small> and not this</small>
   </div>
</div>
返回整个文本(例如,需要选择此项,而不是此项)。
任何建议???

您可以使用
/text()
选项直接获取特定标记下的所有文本节点。如果您只需要第一个,请向其中添加
[1]

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

如果子节点前后都有文本,
div
可能有多个文本节点。正如我同样指出的,我认为获取节点的所有直接文本内容的最佳方法是执行以下操作:

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();
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();