我已将以下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;
}
答案 0 :(得分:3)
在javascript中,for语句for (DOMElement sib = (DOMElement) elt.getPreviousSibling(); sib ; sib = (DOMElement) sib.getPreviousSibling())
的第二部分(; sib;
)将检查是否定义了sib。要将其转换为Java,您需要执行; sib != null;
。那应该是等价的。
因此整个for语句变为for (DOMElement sib = (DOMElement) elt.getPreviousSibling(); sib != null ; sib = (DOMElement) sib.getPreviousSibling())
答案 1 :(得分:1)
如果您的意思是第一个for
循环:
for (;elt.ELEMENT_NODE == elt.getNodeType(); elt = (DOMElement) elt.getParentNode())
然后初始;
表示没有初始化要做。
正常for
循环为: for( initialise ; expression ; update )所以您的只有表达式和更新部分。在您的情况下不需要初始化,因为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的评论),因为这会导致您的程序通过父节点返回直到找到文件的根