2010-03-15 14 views
16

XML şemasını Java sınıfları içine derlemek için JAXB ve xjc kullanıyorum. Bu oluşturulan sınıfları manuel olarak düzenlemek istemiyorum.XJC ve özelleştirilmiş ciltleme ile XMLElementWrapper ek açıklaması nasıl oluşturulur?

<xs:element name="root"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="items"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element ref="item" /> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

XJC sadece Item nesnelerin listesini içeren bir sınıf Items oluşturur: Böyle xml şema var. Items sınıfını atlamak için Item nesnesinin bir listesini doğrudan Root sınıfında bulmak için bir şans var mı?

Bunun, @XMLElementWrapper ek açıklaması ile yapılabileceğini biliyorum, ancak xjc'yi nasıl oluşturacağını nasıl anlatacağımı bilmiyorum.

Önerileriniz için teşekkürler! Markus

cevap

11

Bjarne Hansen bununla ilgilenecek başardı XJC için bir eklenti geliştirdi

Saygılarımızla,. Maalesef, orijinal uygulamaya olan bağlantı artık öldü. Bununla birlikte, Dmitry Katsubo'nun Github'da Bjarne'nin orijinal koduna dayanan ve bazı ek geliştirmeler içeren bir projesi var.

https://github.com/dmak/jaxb-xew-plugin


(Sadece başvuru için: ölü anda orijinal bağlantı: http://www.conspicio.dk/blog/bjarne/jaxb-xmlelementwrapper-plugin)

+0

Thomas teşekkür ederim: Ben olsun bunu yaparken

kod ben aradığınız düşünüyorum üretti. Bu bağlantı, bu konu hakkında gördüğüm ilk uygun içeriktir. – mahonya

+0

Bu eklentiyi kullanmak için bir süredir çalışıyorum ama boşuna. Xjc 2.2.4 ile uyumlu olup olmadığından emin değilim (şu anda sahip olduğum şey). Ayrıca, jaxb-xjc.jar (xjc, JDK7'nin araçlarının bir parçası) yok. Sonunda komut satırından xjc'yi aramak istiyorum ve herkes nasıl yapılacağı konusunda çok iyiydi ([Kohsuke Kawaguchi] (http://weblogs.java.net/blog/kohsuke/archive/2005/06/writing_a_plugi.html)) "Komut satırından da yapabilirsin, ama çok hoş değil." diyor. Neden bir jaxb'e sahip olamıyoruz: xjc'yi bir seviyeye "atlamak", yani sadece bir '@ XmlElementWrapper' oluşturmak için açıklama mı? –

+0

Cevabımın iki yıl önce olduğunu hatırlıyorum - eklentiyi daha sonra kullandım ve iyi çalıştı, ancak şu an modası geçmiş olabilir. – Thomas

8

İlk üretilen hiçbir iç sınıflar vardır böylece şema break up sağlar:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"> 
    <xs:element name="root" type="Root" /> 

    <xs:complexType name="Root"> 
     <xs:sequence> 
      <xs:element name="items" type="Items" /> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="Items"> 
     <xs:sequence> 
      <xs:element name="item" type="xs:string" maxOccurs="unbounded" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

Yine de tek bir dosyada değil, yalnızca ekstra sınıflar alacaksınız. Artık, jaxb-xew-plugin'u kullanmak için derlemenize bir bölüm eklemek istiyorsunuz. Benim için bu görünüyor yüzden, Maven kullanmak gibi:

<plugin> 
    <groupId>org.jvnet.jaxb2.maven2</groupId> 
    <artifactId>maven-jaxb2-plugin</artifactId> 
    <version>0.8.2</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>generate</goal> 
      </goals> 
      <configuration> 
       <args> 
        <arg>-no-header</arg> 
        <arg>-Xxew</arg> 
        <arg>-Xxew:instantiate lazy</arg> 
        <arg>-Xxew:delete</arg> 
       </args> 
       <plugins> 
        <plugin> 
         <groupId>com.github.jaxb-xew-plugin</groupId> 
         <artifactId>jaxb-xew-plugin</artifactId> 
         <version>1.0</version> 
        </plugin> 
       </plugins> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Eğer oluşturulan sınıfları da silme nerede Geçenlerde sabit bir hata var gibi -Xxew:delete bayrağını kapalı bırakın, paket isimleri var ki ad alanlarını kullanarak başlatırsanız nesneler olmamalıdır. Alternatif olarak, kodu github'dan alabilir ve 1.1-SNAPSHOT olarak kullanabilirsiniz. ,

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Root", propOrder = { 
    "items" 
}) 
public class Root { 

    @XmlElementWrapper(name = "items", required = true) 
    @XmlElement(name = "item") 
    protected List<String> items; 

    public List<String> getItems() { 
     if (items == null) { 
      items = new ArrayList<String>(); 
     } 
     return items; 
    } 

    public void setItems(List<String> items) { 
     this.items = items; 
    } 

} 
İlgili konular