Java:获取 org.w3c.dom 文档中元素的 xpath

标签 java dom

我已经写下了我想要实现的目标。但是,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 测试。

关于Java:获取 org.w3c.dom 文档中元素的 xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5269463/

相关文章:

java - android中的图像处理

javascript - 使用 MutationObserver 检测何时将节点添加到文档

java - 什么限制了 Java 应用程序中创建的线程数?

javascript - 如何计算 DIV 或 P 中的行框数量

jQuery BootGrid - 隐藏数据可见的列 ="false"从 DOM 中删除

java - 从mysql中的数据生成pdf

javascript - 查询、排序和替换 DOM 元素

java - JFrame 在 Java Swing GUI 上显示为空

java - WebServlet 注释正在使用,但 GAE 正在尝试查找 web.xml

java - 基于 ANTLR4 的词法分析器在 NetBeans 上键入期间丢失语法突出显示