XML разбирается с Castor и Grails - PullRequest
       23

XML разбирается с Castor и Grails

1 голос
/ 17 сентября 2010

У меня есть проект grails, который содержит несколько доменных объектов. Я использую Java-проект в этом коде, который может разобрать документ для меня. Контроллер, который вызывает этот проект Java, использует JAXB для генерации XML из объекта, возвращенного проектом Java. Я хочу использовать этот документ XML (который генерируется после некоторого синтаксического анализа текста с использованием JAXB) для заполнения классов моего домена в моем проекте grails. Как это работает в Grails? Могу ли я использовать что-то вроде Castor и создать отображение, используя имена моих классных классов? Идея заключается в том, что я хочу сгенерировать новые записи в базе данных и сохранить их для пользователя в зависимости от того, какой текст был проанализирован из загруженного ими документа.

Как это вообще работает в Граале? Могу ли я создать новый объект Domain из контроллера другого объекта с чем-то вроде

 Project p = new Project(); 

, а затем сделать p.save()?

1 Ответ

0 голосов
/ 17 сентября 2010

Загрузите jar-файлы Castor Core и Castor XML из здесь и поместите их в каталог lib (возможно, есть лучший способ управления этой зависимостью с помощью управления зависимостями Grails , но этот быстрый и грязный).

С режимом самоанализа Castor вам не нужно беспокоиться о создании файлов сопоставления, если ваш XML хорошо согласуется с вашими доменами. Вот пример:

Grails-приложение / домен / MyDomain.groovy

class MyDomain {
    String foo
    String bar
}

Grails-приложение / контроллеры / MyController.groovy

import org.exolab.castor.xml.Unmarshaller
import java.io.ByteArrayInputStream

class MyController {

    def myAction = {
        def xml = '''
<myDomain>
  <foo>My Foo String</foo>
  <bar>My Bar String</bar>
</myDomain>
'''
        def reader = new ByteArrayInputStream(xml.bytes).newReader()
        def domain = (MyDomain)Unmarshaller.unmarshal(MyDomain.class, reader)
        domain.save()

        def count = MyDomain.countByFoo('My Foo String')

        render "Found $count results"
    }
}

Перейдите к localhost:8080/appname/my/myAction, и он должен отобразить «Найдено N результатов», N> 0.

...