0

我正在尝试在这里翻译 Javascript 函数。

这将产生一个给定 org.w3c.dom.DOMElement 的基本 xpath 字符串:/html/body/p[3]/a

getElementXpath如果我注释掉getElementIdx()函数和条件,效果很好。问题似乎位于getElementIdx(),但我看不出我做错了什么,下面的 Java 代码与 Javascript 版本几乎相同。

会发生什么是返回一个空字符串!我尝试打印出getElementXpath函数内部的路径,但没有任何效果。预期的输出是一个基本的 xpath 字符串!

更新:

public static String getElementXpath(DOMElement elt){
        String path = ""; 

        for (; elt != null && elt.ELEMENT_NODE == elt.getNodeType(); elt = (DOMElement) elt.getParentNode()){

            path = "test";
            System.out.println(path); //this prints out fine.
        }
        System.out.println(path); //nothing is printed!
            return path;                            
    }

为什么不在 for 循环之外打印路径???

public static void main(String[] args){
    DOMDocument domDocument = (DOMDocument) browser.getDocument();
                        DOMElement currentElement = (DOMElement) domDocument.getElementFromId("uniqueLink");                      
                                System.out.println(getElementXpath(currentElement));

}

public static String getElementXpath(DOMElement elt){
    String path = ""; 

    for (; elt != null && elt.ELEMENT_NODE == elt.getNodeType(); elt = (DOMElement) elt.getParentNode()){
        int idx = getElementIdx(elt);
        String xname = elt.getTagName();

        if (idx > 1) xname += "[" + idx + "]";
        path = "/" + xname + path;  

    }
    System.out.println(path);
        return path;                            
}

public static int getElementIdx(DOMElement elt) {
        int count = 1;

         for (DOMElement sib = (DOMElement) elt.getPreviousSibling(); sib != null; sib = (DOMElement) sib.getPreviousSibling())
            {
                if(sib.ELEMENT_NODE == sib.getNodeType() && sib.getTagName().equals(elt.getTagName())){

                    count++;
                }
            }       
        return count;
    }
4

1 回答 1

1

获得空字符串的唯一原因是此表达式的计算结果为 false:

elt != null && elt.ELEMENT_NODE == elt.getNodeType()

因此,您传递给方法的元素实际上是null或者元素节点类型与elt.ELEMENT_NODE. 在所有其他情况下,结果/至少是。

但是因为您传递了 的实例DOMElement,所以节点应该始终是ELEMENT_NODE类型,所以我很确定,它会为您domDocument.getElementFromId("uniqueLink")返回null当前文档。我会先检查一下。


为了澄清

public static String getElementXpath(DOMElement elt){
    String path = ""; 
    try {
      for (; elt != null && elt.ELEMENT_NODE == elt.getNodeType(); elt = (DOMElement) elt.getParentNode()){
        int idx = getElementIdx(elt);
        String xname = elt.getTagName();    
        if (idx > 1) {
           xname += "[" + idx + "]";
        }
        path = "/" + xname + path;  
        System.out.println("Inside: " + path);  // **1**
      }
    } catch(Exception e) {
        // unhides any exception thrown inside the for loop
        e.printStackTrace();   
    } finally {
        // forces a final print of "path", even if a runtime exception was raised
        System.out.println("Outside: " + path); // **2**
    }
    return path;                            
}

在此代码段中,您会在 ? 处看到非空路径**1**在?处看到空路径。请仔细检查您的实际代码,如果它与您粘贴到问题中的代码相同**2**

于 2011-03-22T06:50:17.883 回答