Java org.w3c.dom - 递归查找并返回 NodeList 中的属性值

标签 java dom recursion

我当前正在解析来自 Web 服务的 XML 响应。它返回有限数量的 <result>元素。我目前正在迭代 NodeList的结果。

当我迭代这个过程时,有时我需要找到每个 <result> 中存在的属性的值。元素。在这种情况下,我想调用一个遍历所有子节点(可能还有子节点的子节点等)并返回属性值的方法。

我尝试递归地执行此操作:

private String findAttrInChildren(Element element, String tag) {
    if (!element.getAttribute(tag).isEmpty()) {
        return element.getAttribute(tag);
    }

    NodeList children = element.getChildNodes();
    for (int i = 0, len = children.getLength(); i < len; i++) {
        if (children.item(i).getNodeType() == Node.ELEMENT_NODE) {
            Element childElement = (Element) children.item(i);
            return findAttrInChildren(childElement, tag);
        }
    }

    // We didn't find it, return null
    return null;
}

不幸的是,这不起作用。递归是这里最好的方法吗?我认为我想在最后返回一个值这一事实让我在某个地方陷入困境,而不是实现 void递归方法。

最佳答案

你太早离开递归了。鉴于

if (children.item(i).getNodeType() == Node.ELEMENT_NODE) {
    Element childElement = (Element) children.item(i);
    return findAttrInChildren(childElement, tag);
}

这将在第一个子元素处结束递归搜索 - 无论子元素或其后代之一是否具有该属性。

因此测试返回的属性是否不为空:

if (children.item(i).getNodeType() == Node.ELEMENT_NODE) {
    Element childElement = (Element) children.item(i);
    String attr = findAttrInChildren(childElement, tag);
    if (attr != null)
        return attr;
}

关于Java org.w3c.dom - 递归查找并返回 NodeList 中的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35437230/

相关文章:

java - 如何使 Android Google 登录按钮仅登录而不使用 FirebaseAuth 注册?

java - 添加原子 double

javascript - 每次更新 jQuery 中的 DOM 引用

由于 DFS 中的迭代器而导致 java.lang.StackOverflowError

Java - 谁能为我解释这个排列代码?

java - 通过递归分而治之获得数组中的最大数字

java - MigLayout:如何更改默认的 “related” 和 “unrelated” 间隙值?

java - 从 HTML 替换不起作用

html - 我可以在没有js或ID的情况下更改iframe src吗?

python - 支持类 DOM 访问的最 Pythonic XHTML/HTML 解析器/生成器/模板模块是什么?