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