2016-02-16 2 views
0

В настоящее время я разбираю XML-ответ от веб-службы. Он возвращает конечное число элементов <result>. В настоящее время я повторяю результаты NodeList.Java org.w3c.dom - Рекурсивно найти и вернуть значение атрибута в 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.

ответ

2

Вы оставляете рекурсию слишком рано. Учитывая

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; 
} 
Смежные вопросы