groovy Путь печати и значение элементов в xml

У меня есть следующий xml:

<list>         
<cars>   
<model>2012</model>
<make>GM</make>         
</cars>    
</list>

Я хочу напечатать эти значения как путь: значение, как показано ниже.

list/cars/model : 2012
list/cars/make : GM

Как я могу этого добиться? Я попробовал метод name(), но он печатает только имя дочернего элемента. Я хочу напечатать весь путь до элемента.

Для этого я могу использовать только парсер xmlSlurper.

Спасибо.


person Bharath Reddy    schedule 10.01.2016    source источник
comment
Вы пробовали парсер xml?   -  person Sachin    schedule 11.01.2016
comment
Нет, я этого не делал. Я могу использовать только xmlSlurper.   -  person Bharath Reddy    schedule 11.01.2016


Ответы (2)


def xml = '''
<list>         
    <cars>   
        <model>2012</model>
        <make>GM</make>
        <color>Gold</color>
    </cars>    
</list>
'''

def item = new XmlSlurper().parseText(xml)

item.'**'.inject([]) { acc, val ->
    def localText = val.localText()
    acc << val.name()

    if( localText ) {
        println "${acc.join('/')} : ${localText.join(',')}"
        acc = acc.dropRight(1) // or acc = acc[0..-2]
    } 
    acc
}

Это будет печатать по мере необходимости. Выше используется поиск depthFirst() по дереву и внедрение (только чтобы не изменять любой другой список) и поиск localText(). Если localText() встретились с указанием значения конечного узла, затем напечатайте путь и значение. Путь накопился в списке, который использовался в инжекте. Простой join() даст требуемый формат.

Вышеописанное было успешно протестировано в Groovy 2.4.5. Если localText() недоступен в NodeChild, причиной может быть версия Groovy старше 2.3.0, поскольку этот метод был добавлен с версии 2.3.0.

person dmahapatro    schedule 11.01.2016
comment
ваш ответ кажется мне интересным. можешь объяснить, что ты пытаешься сделать? это может быть полезно и для других... кстати, ваш код выдает исключение: groovy.lang.MissingMethodException: No signature of method: groovy.util.slurpersupport.NodeChild.localText() is applicable for argument types: () values: [] - person Sachin; 11.01.2016
comment
Я пытаюсь сравнить два элемента из разных XML-файлов. Обычно утверждают x==y : msg сравнивает x и y и печатает msg, если проверка не пройдена. Поэтому при печати сообщения я хочу напечатать полный путь x и y. Метод, который я разместил выше, принимает эти аргументы и возвращает void. Таким образом, мы можем добавить void для сигнатуры метода. Проблемы с печатью полного пути - person Bharath Reddy; 11.01.2016
comment
@BharathReddy Метод, который я опубликовал выше, принимает эти аргументы и возвращает void. Я не вижу никакого метода в вопросе. - person dmahapatro; 11.01.2016

person    schedule
comment
Спасибо за ответ Сачин. - person Bharath Reddy; 11.01.2016
comment
Я также ищу. ), y.name()] } Итак, в этом методе для оператора x.name(), y.name() я хочу напечатать путь. Извините за путаницу. Я ценю вашу помощь. Спасибо - person Bharath Reddy; 11.01.2016