我已经写了我想要实现的目标。但是,getElementIdx()函数未返回正确的计数。 getPreviousSibling()存在问题,但我不知道为什么。

public static String getElementXpath(DOMElement elt){
        String path = "";

        try{
            for (; elt != null; elt = (DOMElement) elt.getParentNode()){
                int idx = getElementIdx(elt);
                String xname = elt.getTagName().toString();

                if (idx >= 1) xname += "[" + idx + "]";
                path = "/" + xname + path;
            }
        }catch(Exception ee){
        }
        return path;
    }

    public static int getElementIdx(DOMElement elt) {
      int count = 1;
      try{

         for (DOMElement sib = (DOMElement) elt.getNextSibling(); sib != null; sib = (DOMElement) sib.getNextSibling())
            {
                if(sib.getTagName().equals(elt.getTagName())){
                    count++;
                }
            }
      }catch(Exception ee){
      }
        return count;
    }

最佳答案

您的标题涉及getPreviousSibling(),但是您的代码仅使用getNextSibling()-为什么?我根本看不到为什么要使用getNextSibling() ...您想找出在当前名称之前有多少个相同名称的元素,而不是在它之后有多少个。

您正在捕获并吞下异常的事实也深深地令人怀疑……您为什么要这样做?如果有异常,该方法是否应以异常终止?

您可能还应该考虑到getPreviousSibling可能不返回元素的事实-例如,它可能返回文本节点。您将要跳过这些-当前您将获得一个异常,该异常将终止循环并返回当前计数。

如果这些方法无济于事,请发布一些示例XML,指出一个节点,并说出当前返回的代码(以及发布更新的代码)。仅仅说它没有返回正确的计数并没有说它确实返回什么以及您期望它返回什么那样有用。

编辑:这是我希望代码看起来像:

public static int getElementIndex(Element original) {
  int count = 1;

  for (Node node = original.getPreviousSibling(); node != null;
       node = node.getPreviousSibling()) {
    if (node instanceof Element) {
      Element element = (Element) node;
      if (element.getTagName().equals(original.getTagName()) {
        count++;
      }
    }
  }

  return count;
}

您也可以使用if (node.getNodeType() == Node.ELEMENT_NODE)代替instanceof测试。

09-28 09:14