2

デフォルトの.netWebBrowserを使用してHTMLElementピッカー(DOM)を作成しました。ユーザーは、HTMLElementをクリックして選択(選択)できます。

HTMLElementに対応するHtmlAgilityPack.HTMLNodeを取得したいと思います。

(私の考えでは)最も簡単な方法はdoc.DocumentNode.SelectSingleNode(EXACTHTMLTEXT)を使用することですが、実際には機能しません(関数はxpathコードのみを受け入れるため)。

これどうやってするの?

ユーザーが選択したHTMLElementのサンプルは次のようになります(OuterHtmlコード)。

<a onmousedown="return wow" class="l" href="http://site.com"><em>Great!!!</em> <b>come and see more</b></a>

もちろん、任意の要素を選択できるので、HTMLNodeを取得する方法が必要です。

4

2 に答える 2

1

私は解決策を思いついた。それが最善かどうかわからない(誰かが私に知らせるためにこれを達成するためのより良い方法を知っていれば幸いです)。

HTMLNodeを取得するクラスは次のとおりです。

public HtmlNode GetNode(string text)
        {

            if (text.StartsWith("<")) //get the type of the element (a, p, div etc..)
            {
                string type = "";
                for (int i = 1; i < text.Length; i++)
                {
                    if (text[i] == ' ')
                    {
                        type = text.Substring(1, i - 1);
                        break;
                    }
                }

                try //check to see if there are any nodes of your HTMLElement type that have an OuterHtml equal to the HtmlElement Outer HTML. If a node exist, than that's the node we want to use
                {
                    HtmlNode n = doc.DocumentNode.SelectNodes("//" + type).Where(x => x.OuterHtml == text).First();
                    return n;
                }
                catch (Exception)
                {
                    throw new Exception("Cannot find the HTML element in the HTML Page");
                }
            }
            else
            {
                throw new Exception("Invalid HTML Element supplied. The selected HTML element must start with <");
            }
        }

アイデアは、HtmlElementのOuterHtmlを渡すことです。例:

HtmlElement el=....
HtmlNode N = GetNode(el.OuterHtml);
于 2012-06-06T01:17:37.463 に答える
1

同じ概念ですが、要素タイプを知る必要がないため、少し単純です。

HtmlNode n = doc.DocumentNode.Descendants().Where(n => n.OuterHtml.Equals(text, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
于 2012-06-07T18:53:38.297 に答える