为什么我的代码是选择所有文本()节点

问题描述:

HtmlNode node = doc.DocumentNode.SelectNodes("//tr")[0]; 
      foreach(HtmlTextNode n in node.SelectNodes("//text()")) 
       Console.WriteLine(n.Text); 

HTML:为什么我的代码是选择所有文本()节点

<table class="infobox" style="width: 17em; font-size: 100%;float: left;"> 
<tr> 
<th style="text-align: center; background: #f08080;" colspan="3">خدیجہ مستور</th> 
</tr> 
<tr style="text-align: center;"> 
<td colspan="3"><a href="/wiki/%D8%AA%D8%B5%D9%88%DB%8C%D8%B1:Khatijamastoor.JPG" class="image" title="خدیجہ مستور"><img alt="خدیجہ مستور" src="//upload.wikimedia.org/wikipedia/ur/thumb/7/7b/Khatijamastoor.JPG/150px-Khatijamastoor.JPG" width="150" height="203" srcset="//upload.wikimedia.org/wikipedia/ur/thumb/7/7b/Khatijamastoor.JPG/225px-Khatijamastoor.JPG 1.5x, //upload.wikimedia.org/wikipedia/ur/thumb/7/7b/Khatijamastoor.JPG/300px-Khatijamastoor.JPG 2x"></a><br> 
<div style="font-size: 90%">خدیجہ مستور</div> 
</td> 
</tr> 
<tr> 
<th style="background: #f08080;" colspan="3">ادیب</th> 
</tr> 
<tr> 
<td><b>ولادت</b></td> 
<td colspan="2"><a href="/wiki/1930%D8%A1" title="1930ء">1930ء</a>، <a href="/wiki/%D9%84%DA%A9%DA%BE%D9%86%D8%A4" title="لکھنؤ">لکھنؤ</a>، <a href="/wiki/%D8%A8%D8%B1%D8%B7%D8%A7%D9%86%D9%88%DB%8C_%DB%81%D9%86%D8%AF%D9%88%D8%B3%D8%AA%D8%A7%D9%86" title="برطانوی ہندوستان" class="mw-redirect">برطانوی ہندوستان</a></td> 
</tr> 
<tr> 
<td><b><a href="/wiki/%D8%A7%D8%B5%D9%86%D8%A7%D9%81_%D8%A7%D8%AF%D8%A8" title="اصناف ادب">اصناف ادب</a></b></td> 
<td colspan="2"><a href="/wiki/%D9%86%D8%A7%D9%88%D9%84" title="ناول" class="mw-redirect">ناول</a></td> 
</tr> 
<tr> 
<td><b>معروف تصانیف</b></td> 
<td colspan="2"><a href="/wiki/%D8%A2%D9%86%DA%AF%D9%86" title="آنگن">آنگن</a></td> 
</tr> 
</table> 

输出应该是:

خدیجہمستور

,但我发现:

خدیجہ مستور

خدیجہمستور

ادیب

ولادت

1930ء , لکھنؤ , برطانویہندوستان

اصنافادب

ناول

معروفتصانیف

آنگن

为什么node.selectNodes( “//文本()”)是选择所有文本()的文档,而文本(节点)从刚刚第一tr标签的节点?

+0

它看起来像你想的SelectSingleNode() – Jonesopolis

+0

没有真正我想要的文字()所有的TR标记单独节点区分某些数据连接并将其存储起来。 doc.DocumentNode.Select(“// tr”)[0]应该选择第一个tr,然后我应用这个tr行来获取所有仅在此tr中的子元素的text()元素。 –

+0

gotcha我误读/误解了然后 – Jonesopolis

因为你把两个正斜杠您的XPath(//tr),它选择的所有元素文档中,不只是选择的节点的后代的开始。

试试这个:

foreach (HtmlTextNode n in node.SelectNodes("text()")) 

或者只是简化了XPath来:

var node = doc.DocumentNode.SelectSingleNode("//tr[1]/text()"); 
Console.WriteLine(node.Text); 
+0

这是生成异常,而不是System.nullReferenc:引用未设置为任何对象? –

+0

/text()正在生成nullReference的异常,text()没有选择什么? –

+0

thanx我得到它有一个xpath的问题,我被给予// tr首先选择文档中的所有tr节点,然后// text()选择整个文档中的所有text()元素,而不是** // tr [0 ] // text()**这是正确的路径,它告诉整个文档中第一个或第十个tr的text()//意味着选择整个文档中的所有节点而不是当前othervise给出正确的路径 –