我已将以下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的评论),因为这将导致您的程序通过父节点进行工作,直到找到文档的根目录为止

10-08 15:10