0

ここでJavascript関数を翻訳しようとしています。

これにより、org.w3c.dom.DOMElementを指定して基本的なxpath文字列が生成されます。/html/body/p[3]/a

getElementXpathgetElementIdx()関数と条件をコメントアウトすると正常に動作します。問題はにあるようですが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 に答える