以下java方法有什么问题?

时间:2011-03-22 06:19:10

标签: java dom dom4j

我正在尝试翻译Javascript函数here.

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

如果我注释掉getElementXpath函数和条件,那么

getElementIdx()可以正常工作。问题似乎位于getElementIdx(),但我看不出我做错了什么,下面的Java代码几乎与Javascript版本相同。

发生的是返回一个空字符串!我尝试打印getElementXpath函数内的路径,但没有avil。预期输出是基数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;
    }

1 个答案:

答案 0 :(得分:1)

获取空String的唯一原因是此表达式的计算结果为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**的{​​{1}}和路径中看到非空路径?请仔细检查您的实际代码,如果它与您粘贴到问题中的代码相同