我已将以下Javascript代码转换为Java。问题发生在同级;
http://snippets.dzone.com/posts/show/3754
我从未见过这样的说法。添加分号时,它到底有什么作用?这像while()语句吗?
public static String getElementXpath(DOMElement elt){
String path = "";
for (;elt.ELEMENT_NODE == elt.getNodeType(); elt = (DOMElement) elt.getParentNode()){
int idx = getElementIdx(elt);
}
return path;
}
private static int getElementIdx(DOMElement elt) {
int count = 1;
for (DOMElement sib = (DOMElement) elt.getPreviousSibling(); sib ; sib = (DOMElement) sib.getPreviousSibling())
{
if(sib.ELEMENT_NODE == sib.getNodeType() && sib.getTagName() == elt.getTagName()) count++;
}
return count;
}
最佳答案
如果您的意思是第一个for
循环:
for (;elt.ELEMENT_NODE == elt.getNodeType(); elt = (DOMElement) elt.getParentNode())
则初始
;
指示没有初始化要完成。正常的
for
循环是:for(初始化;表达式;更新),因此您的循环只有表达式和更新部分。您无需进行初始化,因为DOMElement
作为参数传入,在for
循环中使用它之前不需要任何其他步骤。回应评论:
在循环的每次迭代之前,都要执行测试
elt.ELEMENT_NODE == elt.getNodeType()
。这将测试elt
引用的节点是元素节点(即不是文本节点,属性节点,注释节点等)。如果测试失败,则执行循环主体。在循环的主体中,调用
getElementIdx
可以计算该节点在同名兄弟姐妹之间的相对位置。此值存储在idx
中,但不执行任何操作,然后将该值丢弃。在执行循环主体之后,将执行更新
elt = (DOMElement) elt.getParentNode()
。这将更改elt
以引用其先前引用的节点的父节点。第一步,我将
elt.ELEMENT_NODE == elt.getNodeType()
更改为Node.DOCUMENT_NODE == elt.getNodeType()
(请参见下面的PaŭloEbermann的评论),因为这将导致您的程序通过父节点进行工作,直到找到文档的根目录为止