我正在尝试翻译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;
}
答案 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}}和空路径中看到非空路径?请仔细检查您的实际代码,如果它与您粘贴到问题中的代码相同