define:无法将org.w3c.dom.domElement转换为boolean

时间:2011-03-17 23:04:52

标签: java javascript

我已将以下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;
    }

2 个答案:

答案 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的评论),因为这会导致您的程序通过父节点返回直到找到文件的根