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 显示正确。

如果页面是在 Internet Explorer 中打开的(就像 webbrowser 一样),<layer>则不包括作为父页面。

所以问题在于 Internet Explorer 没有正确“解析”dom。解决办法是什么?什么功能可以帮助为这种情况创建 xpath(如果使用 webbrowser htmlelement)。

4

1 回答 1

0

这不是您问题的直接答案;但已考虑使用http://htmlagilitypack.codeplex.com/加载 HTML。它不会有忽略元素的问题。

于 2012-06-08T00:58:31.417 回答