我当前正在解析来自 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/