2010-09-16 5 views
1

J'ai un projet grails qui contient quelques objets de domaine. J'utilise un projet java dans ce code qui peut analyser un document pour moi. Le contrôleur qui appelle ce projet Java utilise JAXB pour générer du code XML à partir de l'objet renvoyé par le projet Java. Je veux utiliser ce document XML (qui est généré après une analyse de texte, en utilisant JAXB) pour remplir mes classes de domaine dans mon projet grails. Comment cela fonctionne dans les grails? Puis-je utiliser quelque chose comme Castor, et créer un mapping en utilisant les noms de mes classes groovy? L'idée est de générer de nouvelles entrées dans la base de données et de les enregistrer pour l'utilisateur en fonction du texte analysé dans le document téléchargé.Unmarshalling XML avec Castor et Grails

Comment cela fonctionne même dans les grails de toute façon? Puis-je créer un nouvel objet de contrôleur de domaine d'un autre objet avec quelque chose comme

Project p = new Project(); 

puis faire un p.save()?

+0

La réponse à votre deuxième question est oui. Les domaines et les contrôleurs ne doivent pas nécessairement être en tête-à-tête. Vous pouvez avoir une classe de domaine 'Foo' et un' BarController' qui fonctionne avec 'Foo's et être très bien. –

+0

Etes-vous lié à Castor ou êtes-vous ouvert à d'autres frameworks? Je peux vous donner un exemple en utilisant XStream; J'ai déjà travaillé avec. –

+0

Je suis ouvert à tout - Castor était exactement ce qui m'a été suggéré - je n'ai pas beaucoup travaillé avec XML auparavant. Je suis fondamentalement en train de construire un analyseur de texte qui extraira des informations d'un document pour lequel nous avons des objets de domaine correspondants dans Grails. L'analyseur que j'ai écrit en Java, et je l'ai appelé de mon contrôleur groovy. Il renvoie une chaîne avec ma représentation XML dedans. C'est ce que je veux mapper aux Objets du Domaine de Grails. Si vous avez un petit exemple de projet de grails montrant ceci ce serait génial. J'ai également les contrôleurs pour les objets de domaine de grails à créer "manuellement" aussi bien. – Derek

Répondre

0

Téléchargez le Castor de base et jarres XML Castor de here et de les mettre dans le répertoire lib (il y a probablement une meilleure façon de gérer cette dépendance à l'aide Grails' dependency management, mais celui-ci est un moyen rapide et sale). Avec Castor introspection mode, vous n'avez pas besoin de vous soucier de créer des fichiers de mappage si votre fichier XML correspond parfaitement à vos domaines. Voici un exemple:

Grails-app/domain/MyDomain.groovy

class MyDomain { 
    String foo 
    String bar 
} 

Grails-app/controllers/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" 
    } 
} 

Accédez à localhost:8080/appname/my/myAction et il devrait afficher "Trouvé N résultats", N> 0.

+0

Basé sur la lecture de l'introspection - disons que mon fichier XML contient beaucoup de choses - est-ce que être assez intelligent pour voir que comme je suis en train de lancer (MyDomain) taper pour unmarshaller, qu'il va chercher dans le fichier XML pour trouver ces objets? – Derek

+0

Pouvez-vous donner un exemple de ce que serait votre XML? Cela pourrait m'aider à mieux comprendre vos intentions. –

+0

http://pastebin.com/8Qb1ewdM Voici un pastebin d'un exemple de sortie. Les classes de domaine seraient Education, Employeur, Projet, Outil, Compétence. Si c'est un classtype intégré ici, tel que projet, alors Employeur détient une liste de ces objets, de cette façon le bon projet est lié au bon employeur – Derek