2010-12-08 3 views
1

J'essaie de trouver une bibliothèque qui me permet de placer le contenu d'un fichier XML dans un JavaBean (quelque chose comme Digester, Jaxb, JIXB, etc.) mais dont j'ai besoin pour l'exécuter (pas au moment de la compilation, ou par la génération de code d'octet) et utiliser un fichier de mappage quelconque.Outil de mappage XML vers Java - avec descripteur de mappage

L'idée sera quelque chose comme les fichiers de mapping HBM de Hibernate, un moyen de spécifier quel élément XML va dans quelle propriété Java. J'utilise actuellement Digester mais je veux quelque chose de plus simple pour son fichier de règles.

Cela devrait également fonctionner sur un 1.4 JDK donc les annotations ne le feront pas vraiment (mais je considérerai de telles réponses uniquement pour des raisons de complétude). Pour résumer, j'ai besoin d'un outil d'exécution XML à Java basé sur un descripteur XML, quelque chose comme ça (tiré de JIXB) mais à l'exécution (ie passer le XML, la classe Java à l'objet de sortie et le descripteur de correspondance):

alt text

Connaissez-vous une telle bibliothèque?

Merci!

Répondre

0

Essayez Castor. Il est capable de générer du code Java à partir de la DTD (et probablement aussi à partir de XSD). Ainsi, vous pouvez générer le code lors de l'exécution, puis le compiler.

BTW vérifier à nouveau JAXB. Je crois que cela peut faire la même chose.

+1

J'ai déjà les classes Java et les fichiers XML. Je ne peux pas changer ça, alors j'ai besoin de les coller avec un descripteur qui dit "ça va ici". Générer des choses n'est pas vraiment une option. Merci pour votre réponse! – user1010

+0

Je pense que je vais essayer le "mode de cartographie" de Castor. Semble faire ce dont j'ai besoin sans aucune génération de code du tout. Merci encore. – user1010

2

Essayez XSLT.

Vous pouvez prendre le fichier XML d'entrée et le transformer dans un autre fichier XML qui sera l'entrée de Jaxb/XmlBeans/... pour remplir votre bean.

Le fichier XSL sera la configuration "d'exécution" qui décrira le mappage.

XML d'entrée --- (XSLT) ---> XML Bean --- (JAXB) ---> Java Bean

0

Hibernate a fait un certain soutien pour le mappage XML. Voir the doc pour plus d'infos. J'ai fait un PoC il y a quelque temps, et j'ai trouvé qu'il manquait un peu à la documentation. Je n'ai pas trouvé comment utiliser correctement les espaces de noms. Nous avons finalement utilisé Rome car nous avions seulement besoin d'analyser/générer des flux Atom avec des espaces de noms personnalisés. Mais je ne pense pas que Rome va résoudre votre problème. Les mappages sont faits en code Java, et il est limité dans l'analyse/génération de RSS/Atom ...

Bonne chance! Et si vous finissez par utiliser Hibernate, j'aimerais savoir comment cela fonctionne pour vous!

0

Apache Commons Digester devrait probablement être un outil intéressant à considérer. Il fait ce dont vous avez besoin, c'est-à-dire prend un XML et le transforme en bean Java.

+1

Comme je l'ai dit dans ma question, j'utilise actuellement Digester mais j'ai besoin d'un moyen de simplifier ses "règles" qui impliquent de savoir comment fonctionne le digesteur, comment les éléments sont placés et retirés de sa pile interne, etc. une cartographie comme http://i.imgur.com/XMYEC.gif – user1010

0

EclipseLink JAXB (MOXy) (Je suis le responsable technique) a un fichier de mappage XML. Pour votre exemple, le fichier de mappage serait:

.xml

<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
    package-name="blog.bindingfile"> 
    <java-types> 
     <java-type name="Customer"> 
      <xml-root-element/> 
      <xml-type prop-order="person street city state zip phone"/> 
     </java-type> 
     <java-type name="Person"> 
      <xml-type prop-order="customerNumber firstName lastName"/> 
      <java-attributes> 
       <xml-element java-attribute="customerNumber" name="cust-num"/> 
       <xml-element java-attribute="firstName" name="first-name"/> 
       <xml-element java-attribute="lastName" name="last-name"/> 
      </java-attributes> 
     </java-type> 
    </java-types> 
</xml-bindings> 

Modèle de domaine

Ceci cartographier les classes suivantes:

package blog.bindingfile; 

public class Customer { 

    public Person person; 
    public String street; 
    public String city; 
    public String state; 
    public Integer zip; 
    public String phone; 

} 

package blog.bindingfile; 

public class Person { 

    public int customerNumber; 
    public String firstName; 
    public String lastName; 

} 

XML

depuis/vers le code XML suivant:

<?xml version="1.0" encoding="UTF-8"?> 
<customer> 
    <person> 
     <cust-num>123456789</cust-num> 
     <first-name>John</first-name> 
     <last-name>Smith</last-name> 
    </person> 
    <street>12345 Happy Lane</street> 
    <city>Plunk</city> 
    <state>WA</state> 
    <zip>98059</zip> 
    <phone>888.555.1234</phone> 
</customer> 

Code Demo

Comme l'a démontré:

package blog.bindingfile; 

import java.io.File; 
import java.util.HashMap; 
import java.util.Map; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.Unmarshaller; 

import org.eclipse.persistence.jaxb.JAXBContextFactory; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     Map<String, Object> properties = new HashMap<String, Object>(1); 
     properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, new File("binding.xml")); 
     JAXBContext jc = JAXBContext.newInstance("blog.bindingfile", Customer.class.getClassLoader() , properties); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     Customer customer = (Customer) unmarshaller.unmarshal(new File("input.xml")); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(customer, System.out); 
    } 

} 

jaxb.properties

Pour utiliser Moxy comme la mise en œuvre de JAXB vous devez inclure un fichier avec votre jaxb.properties classes du modèle avec l'entrée suivante:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

Remarque

Cet exemple utilise le bootstrapping simplifié disponible dans la prochaine version EclipseLink 2.2. Pour un exemple d'utilisation EclipseLink 2.1 voir: