2012-04-03 4 views
0

Ich versuche, ein POJO zu einem XML zuzuordnen. Nun besteht das POJO aus einigen Attributen, die Basis-String/Integer usw. sind, und einige, die andere POJO-Klassen sind. Die XML-Zuordnungsdatei, die ich erstellen möchte, möchte, dass ein XML-Element auf der obersten Ebene mit einem Java-Attribut gefüllt wird, das zwei Ebenen tief ist.Java zu XML-Castor-Zuordnung

zum Beispiel, wenn ich zwei Java-Klasse `

class classA{ 

private ClassB var1 
private String var2 

} 

class classB{ 
private ClassC var3; 
} 

class classC{ 
private String var4; 
} 

Nun meine XML-Mapping sieht aus wie

Cruiseline Mapping

<class name="ClassA" 
    auto-complete="false" 
> 
    <map-to xml="Sample" /> 
    <field name="var2"> 
     <bind-xml node="attribute" name="var2" /> 
    </field> 
    <field name="var4 from classC"> 
     <I want a mapping for the var4 from classC to appear here. How do I do that ?> 
</class> 

` Wie Sie sehen, möchte ich das Mapping für var4 von Klasse C im XML-Element Sample. Ich möchte, dass es ein Element des Beispielelements ist.

`

<Sample var2="value"> 
    <data var4="var4 value"> 
</Sample> 

`

Hilfe zu schätzen!

+0

Wenn Sie Castor nicht verwenden, kann ich Ihnen helfen, diesen Anwendungsfall mit EclipseLink JAXB (MOXy) zu mappen: http://www.eclipse.org/eclipselink/moxy.php –

+1

Blaise: Ich habe EclipseLink nicht benutzt vorher, aber ich denke, ich kann aus Castor herauskommen, wenn es relativ einfach ist, EclipseLink zu übernehmen? Es ist nur so, dass das gesamte Projekt Castor verwendet hat, so dass es konsistenter wäre. Könntest du aber bitte Eclipselink näher erläutern? Vielen Dank. – TYS

Antwort

1

Hinweis: Ich bin das EclipseLink JAXB (MOXy) Blei und Mitglied der JAXB 2 (JSR-222) Expertengruppe.

Blaise: Ich habe bisher noch nicht verwendet Eclipse, aber ich denke, ich kann Bewegung aus Rizinus, wenn es relativ einfach ist, Eclipse zu adoptieren? Es ist nur, dass das gesamte Projekt Castor verwendet hat, so dass es konsistenter wäre. Könntest du aber bitte Eclipselink näher erläutern? Danke. - TYS

EclipseLink MOXy ist eine JAXB (JSR-222) Implementierung. Ein Blick auf Ihre Frage kann dieses Modell auf die gewünschte XML unter Verwendung eines beliebigen JAXB Umsetzung wie folgt abgebildet werden:

KlasseA

package forum9994762; 

import javax.xml.bind.annotation.*; 

@XmlRootElement(name="Sample") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class ClassA { 

    @XmlElement(name="data") 
    private ClassB var1; 

    @XmlAttribute 
    private String var2; 

} 

ClassB

package forum9994762; 

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class ClassB { 

    @XmlAttribute(name="var4") 
    private ClassC var3; 

} 

ClassC

package forum9994762; 

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class ClassC { 

    @XmlValue 
    private String var4; 

} 

Demo

package forum9994762; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(ClassA.class); 

     File xml = new File("src/forum9994762/input.xml"); 
     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     ClassA classA = (ClassA) unmarshaller.unmarshal(xml); 

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

} 

Eingang.xml/Output

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Sample var2="value"> 
    <data var4="var4 value"/> 
</Sample> 

Mapping-Datei

Als Castor Benutzer, können Sie es vorziehen, Ihre Metadaten als externe Mapping-Datei repräsentiert. Eclipse moxy bietet eine solche Verlängerung:

binding.xml

<?xml version="1.0" encoding="UTF-8"?> 
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
    package-name="forum9994762" 
    xml-accessor-type="FIELD"> 
    <java-types> 
     <java-type name="ClassA"> 
      <xml-root-element name="Sample"/> 
      <java-attributes> 
       <xml-element java-attribute="var1" name="data"/> 
       <xml-attribute java-attribute="var2"/> 
      </java-attributes> 
     </java-type> 
     <java-type name="ClassB"> 
      <java-attributes> 
       <xml-attribute java-attribute="var3" name="var4"/> 
      </java-attributes> 
     </java-type> 
     <java-type name="ClassC"> 
      <java-attributes> 
       <xml-value java-attribute="var4"/> 
      </java-attributes> 
     </java-type> 
    </java-types> 
</xml-bindings> 

Demo

package forum9994762; 

import java.io.File; 
import java.util.*; 
import javax.xml.bind.*; 
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, "forum9994762/binding.xml"); 
     JAXBContext jc = JAXBContext.newInstance("forum9994762", ClassA.class.getClassLoader(), properties); 

     File xml = new File("src/forum9994762/input.xml"); 
     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     ClassA classA = (ClassA) unmarshaller.unmarshal(xml); 

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

} 

Weitere Informationen Benutzer

+0

Blaise - Vielen Dank für Ihre Antwort. Es gibt eine Sache in der XML-Mapping-Datei, die ich nicht verstehe und im Grunde ist das gleiche wie mein ursprüngliches Problem. Wenn ich Annotationen verwende, sehe ich, wie Ihre Methode mir helfen kann, aber ich möchte die Java-Objekte nicht ändern und möchte den Mapping-Ansatz verwenden. Das bringt mich zum selben Problem zurück. Ich denke, meine Frage ist eher mappingspezifisch, wie referenziere ich ein xml-Element/-Attribut von einem Wert von 2/3 Ebenen tief in einem Java-Objekt und fülle es auf. – TYS

+0

@TYS - Ich habe meine Antwort mit einer EclipseLink JAXB (MOXy) Mapping-Datei aktualisiert, die den zuvor gegebenen Anmerkungen entspricht. –

+0

Danke Blaise. Ich probiere das aus. Hier ist, was ich bisher gemacht habe. Ich habe die eclipseLink.jar heruntergeladen und sie dem Buildpfad meines Projekts hinzugefügt. Ich habe deinen Demo-Code mit meinen Klassen aktualisiert. Eine Klarstellung, während ich eine neue Instanz des JaxBContext erhalte, führte ich System.out.println (org.eclipse.persistence.Version.getVersion()); und ich bekomme 2.3.2 als Version. Ich bin nicht in der Lage, einen JaxbContext zu erstellen, da das Programm fehlschlägt, dass eine der Klassen innerhalb des Domänenobjekts keinen Nullargumentkonstruktor hat und nicht unterstützt wird. Ich benutze Java 1.5 – TYS

0

Wenn Sie auto-complete=false in Ihrer mapping.xml Datei für KlasseA <class name="ClassA" auto-complete="false" > dann verwenden Sie Castor Einweiser sagen muss, wie individuell ClassB und ClassC abzubilden. Einschließlich diesen beiden Linien können Sie helfen, die ersten Schritte:

<class name="ClassB" auto-complete="true"> 
<map-to xml="class-B" /> 
</class> 
<class name="ClassC" auto-complete="true"> 
<map-to xml="class-C" /> 
</class> 

Aber da var4 ist Mitglied der ClassC aber nicht ClassB, wird es in Ihrer XML-Ausgabe Hierarchie eine Ebene tief sein.