Что не так со следующими методами Java? - PullRequest
0 голосов
/ 22 марта 2011

Я пытаюсь перевести здесь функцию Javascript .

Это даст кардинальную строку xpath, заданную org.w3c.dom.DOMElement: /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;
    }

1 Ответ

1 голос
/ 22 марта 2011

Причиной получения пустой строки только для only является то, что это выражение оценивается как 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**?Пожалуйста, проверьте ваш реальный код, если он совпадает с кодом, который вы вставили в вопрос

...