在子ul中获取li节点但不是li

时间:2014-10-15 15:04:27

标签: c# asp.net html-agility-pack

我有一个看起来像这样的html结构:

<ul class='plus'>
  <li>cxvcvxcv
  </li>
  <li>cxvcvxcv
  </li>
  <li>cxvcvxcv
  </li>
  <li>cxvcvxcv
      <ul>
         <li>ewfwefewfwef</li>
         <li>gergrjmkuykmuyk</li>
      </ul>
  </li>
  <li>cxvcvxcv
  </li>
</ul>

我需要抓住顶级li项目,但不要抓住孩子们的任何项目。

我目前使用HTMLAgilityPack使用此代码获取所有li项:

nodes = document.DocumentNode.SelectSingleNode("//ul[@class=\"plus\"]").SelectNodes(".//li");

我如何调整它以排除儿童中包含的任何lis?

1 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

//ul[@class="plus"]/li[not(child::*[local-name() = 'ul'])]

但是当然li节点作为孩子返回ul节点,我认为您希望将其包含在结果中:

<li>cxvcvxcv
  </li>

<li>cxvcvxcv
  </li>

<li>cxvcvxcv
  </li>

<li>cxvcvxcv
  </li>

您将无法将结果“过滤”为您想要的节点,但您可以使用text()来获取它们:

//ul[@class="plus"]/li/text()

<强>结果:

cxvcvxcv

cxvcvxcv

cxvcvxcv

cxvcvxcv



cxvcvxcv

您会将这些视为文本节点,您仍然可以对它们进行迭代,但是您必须考虑它为那些带有子节点的节点设置的空节点。

修改 您的其他信息使解决方案更加简单......

//ul[@class="plus"]/li/@href