Синтаксический анализ XML с многострочными записями

#xml #grails #groovy

Вопрос:

Я хотел бы взять XML в формате ниже и загрузить каждую запись кода в объект домена в моем BootStrap.groovy . Я хочу сохранить форматирование каждого фрагмента кода.

XML

 <records>
    <code>
        <language>Groovy</language>
        <snippet>
            println "This is Groovy"
            println "A very powerful language"
        </snippet>
    </code>
    <code>
        <language>Groovy</language>
        <snippet>
            3.times {
                println "hello"
            }
        </snippet>
    </code>
    <code>
        <language>Perl</language>
        <snippet>
            @foo = split(",");
        </snippet>
    </code>
</records>
 

Объект Домена

 Code {
    String language
    String snippet
}
 

Бутстрэп.классный

 new Code(language l, snippet: x).save()
 

Комментарии:

1. Я немного исправил форматирование, надеюсь, вы не возражаете, и, тем не менее, я невольно не изменил семантику вашего поста.. (пожалуйста, не стесняйтесь вернуть его, если у меня есть!)

2. хех, мы оба отредактировали его одновременно. я был быстрее и проиграл 🙁

3. Ой, извини, парень. Рад видеть, что мы оба внесли почти одинаковые изменения ;). Я удивлен, что сайт не информирует вас, редактировалось ли сообщение с тех пор, как вы начали с ним возиться.. Искажать изменения других людей нехорошо.

Ответ №1:

примерно что-то вроде этого:

 def CODE_XML = '''
<records>
    <code>
        <language>Groovy</language>
        <snippet>
            println "This is Groovy"
            println "A very powerful language"
        </snippet>
    </code>
    <code>
        <language>Groovy</language>
        <snippet>
            3.times {
                println "hello"
            }
        </snippet>
    </code>
    <code>
        <language>Perl</language>
        <snippet>
            @foo = split(",");
        </snippet>
    </code>
</records>
  '''
def records = new XmlParser().parseText(CODE_XML)
records.code.each() { code ->
    new Code(language: code.language, snippet: code.snippet).save()
}
 

Ответ №2:

Если вы можете указать DTD или что-то подобное, и ваш синтаксический анализатор XML подчиняется ему, я думаю, вы можете указать содержимое элемента фрагмента как CDATA и всегда получать его как есть.

Ответ №3:

Попробуйте добавить xml:space="preserve" атрибут к <snippet> элементам.