计算多个节点集

时间:2014-03-28 18:56:53

标签: c# xpath html-agility-pack

var cats = doc.DocumentNode.SelectNodes("xpath1 | xpath2");

我使用|运算符计算多个节点和html agilitypack将它们放在一个包含所有结果的NodeCollection中,我如何知道Node是否是xpath1或xpath2的结果?

例如

 var cats = doc.DocumentNode.SelectNodes("//*[contains(@name,'thename')]/../../div/ul/li/a | //*[contains(@name,'thename')]/../../div/ul/li/a/../div/ul/li/a");

我正在尝试构建树状结构,因为第一个xpath返回单个元素,第二个xpath返回单个或多个元素,第一个xpath是主树节点,第二个xpath是该节点的childeren,我想根据结果的内部文本构建一个List<string,List<string>>

为了使它更简单,请考虑以下Html:

<ul>
   <li>
      <h1>Node1</h1>
      <ul>
         <li>Node1_1</li>
         <li>Node1_2</li>
         <li>Node1_3</li>
         <li>Node1_4</li>
      </ul>
   </li>
   <li>
      <h1>Node2</h1>
      <ul>
         <li>Node2_1</li>
         <li>Node2_2</li>
      </ul>
   </li>
   <li>
      <h1>Node3</h1>
      <ul>
         <li>Node3_1</li>
         <li>Node3_2</li>
         <li>Node3_3</li>
      </ul>
   </li>
</ul>

var cats = doc.DocumentNode.SelectNodes("//ul/li/h1 | //ul/li/ul/li")

1 个答案:

答案 0 :(得分:1)

为什么不这样做:

var head = doc.DocumentNode.SelectNodes("xpath1");
var children = head.SelectNodes("xpath2");

对于示例中的代码,您可以这样做:

var containerNodes = doc.DocumentNode.SelectNodes("//ul/li");
foreach(var n in containerNodes)
{
  var headNode = n.SelectSingleNode("h1");
  var subNodes = n.SelectNodes("ul/li");
}