2

私はXPATHジェネレーターに取り組んでいます(絶対パスを使用)。アイデアは、HTMLElement(webbrowserにあります)を渡す関数があり、次のようにXPATHを返すというものです。

/ html / body / div [3] / div [1] / a

xpathを生成する関数は次のようになります。

HTMLElement node=...;
while (node != null)
     {
       int i = FindElementIndex(node); //find the index of our current node in the parent elements
       if(i==1)
          xpath.Insert(0, "/" + node.TagName.ToLower());
       else
          xpath.Insert(0, "/" + node.TagName.ToLower() + "[" + i+ "]");
       node = node.Parent;
    }

アイデアはこれです:

a)要素を取る

b)element.parentで要素のインデックス位置を見つけます

c)xpathを追加する

親が""のようなカスタムhtmlコードである場合、問題が発生します<layer>。例:

<html>
  <body>
     <div>
        <layer>
           <a href="http://site.com">aaa</a>
        </layer>
      </div>
  </body>
</html>

HTMLElementがで<a href="http://site.com">aaa</a>あり、ourelement.Parentを呼び出す場合、要素ではなくDIV要素が返されます

したがって、次の代わりに: / html / body / div / layer / a

(これは正しくありません) / html / body / div/aがあります

これはどのように解決できますか?誰かがこれを理解するのを手伝ってくれることを本当に願っています。

編集1:テストの目的で、JavaScriptのXPathクエリで取得した後、ノードのフルパスを取得するから関数を実装しました

その結果、「カスタム」タグ(のような<layer>)を含むページと、ページがFirefoxで開かれた場合、xpathが正しく表示されました。

ページがInternetExplorerで開かれた場合(webbrowserのように)、そのページは<layer>親として含まれていませんでした。

したがって、問題はInternetExplorerがDOMを正しく「解析」していないことにあります。解決策は何ですか?このような場合のxpathの作成に役立つ関数は何ですか(webbrowser htmlelementを使用している場合)。

4

1 に答える 1

0

これはあなたの質問に対する直接の答えではありません。ただし、 http://htmlagilitypack.codeplex.com/を使用してHTMLをロードすることを検討しています。要素を無視するという問題はありません。

于 2012-06-08T00:58:31.417 に答える