2

HtmlAgilityPack で使用するこの XPath の選択には多くの問題があります。

別のウィッチにliネストされているすべての要素 (存在する場合) を選択したいのですが、 のタグがあります。これはhtmlのサンプルです:liaid="menuItem2"

<div id="menu">
  <ul>
    <li><a id="menuItem1"></a></li>
    <li><a id="menuItem2"></a>
       <ul>
          <li><a id="menuSubItem1"></a></li>
          <li><a id="menuSubItem2"></a></li>
       </ul>
    </li>  
    <li><a id="menuItem3"></a></li>
  </ul>
</div>

これは私が使用しているXPathです。この部分/ul/liを失うと、必要なタグが取得されますがa、彼の子孫が必要です...このXPathは常にnullを返します。

string xpathExp = "//a[@id='" + parentIdHtml + "']/ul/li";
HtmlNodeCollection liNodes = htmlDoc.DocumentNode.SelectNodes(xpathExp);
4

4 に答える 4

1

次のXPathが機能するはずです。

string xpathExp = "//li/a[@id='" + parentIdHtml + "']/following-sibling::ul/li";
于 2012-05-30T22:29:06.190 に答える
0

XPath は非常に厄介です。HtmlAgilityPack を使用していますが、LINQ を活用することもできます。

//find the li -- a *little* complicated with nested Where clauses, but clear enough.
HtmlNode li = htmlDoc.DocumentNode.Descendants("li").Where(n => n.ChildNodes.Where(a => a.Name.Equals("a") && a.Id.Equals("menuItem2", StringComparison.InvariantCultureIgnoreCase)).Count() > 0).FirstOrDefault();
IEnumerable<HtmlNode> liNodes = null;
if (li != null)
{
    //Node found, get all the descendent <li>
    liNodes = li.Descendants("li");
}
于 2012-05-30T22:41:28.017 に答える
0

あなたの説明から、idと?のタグを<li>含む 2 つの要素を選択したいと思います。<a>menuSubItem1menuSubItem2

もしそうなら、これはあなたが必要とするものです

//li[a/@id="menuItem2"]//li
于 2012-05-31T04:01:15.853 に答える
0

あなたのxpathのためにこれを試してください:

string xpathExp = "//li[a/@id='" + parentIdHtml + "']/ul/li";

a問題は、子を持たないノード自体を選択したことですulli最初にノードを選択し、そのa子をフィルタリングする必要があります。

于 2012-05-30T22:20:50.167 に答える