2012-03-13 18 views
8

Soru: Nasıl XJC/JAXB'ın aynı ad alanında yinelenen elementdefinitions içeren çeşitli şemaları için screensize javaclasses üretmek yapabilirim?Derleme birkaç XSD en barındıran yinelenen tanımları

Bilgi: Üç .Xsd şemalar var: A, B ve C Hepsi aynı targetNamespace var. Hepsi bana verilen 3 şemadan oluşuyor ve ben hiçbir şekilde onları herhangi bir şekilde değiştirmelerine izin vermedim.

Bunlar A aynı zamanda B ve C bulunan bazı öğeleri (ama bir öz bir çok elemanlarının yanı ilan vardır) Örnek:

<xs:simpleType name="y_ym_ymdDatoType"> 
    <xs:union memberTypes="arcgYearType arcgYearMonthType arcDateType"/> 
</xs:simpleType> 
<xs:simpleType name="arcgYearType"> 
    <xs:restriction base="xs:gYear"> 
     <xs:minInclusive value="1700"/> 
     <xs:maxInclusive value="2100"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:simpleType name="arcgYearMonthType"> 
    <xs:restriction base="xs:gYearMonth"> 
     <xs:minInclusive value="1700-01"/> 
     <xs:maxInclusive value="2100-12"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:simpleType name="arcDateType"> 
    <xs:restriction base="xs:date"> 
     <xs:minInclusive value="1700-01-01"/> 
     <xs:maxInclusive value="2100-12-31"/> 
    </xs:restriction> 
</xs:simpleType> 
: Bu, A ve C için aynı "kod"

javaclasses bunları derlemek XJC kullanarak, ben aşağıdaki özel durum alıyorum:

[ERROR] 'y_ym_ymdDatoType' is already defined 
line 297 of file:../c.xsd 

[ERROR] (related to above error) the first definition appears here 
line 309 of file:../a.xsd 

ve aynı diğer elemanlarına olur: arcgYearType, arcgYearMonthType ve arcDateType.

Bu sorunu çözebilecek bir ciltleme dosyası hakkında okudum, ancak nasıl yapılacağından emin değilim, bu nedenle örnekler çok tercih edilir.

cevap

0

Çekirdekleri bağlama dosyasını kullanarak el ile çözebilirsiniz. Burada örnek çelişkili adları için özel adını belirtebilirsiniz nerede, şudur: ne tarif, ben hiçbir XSD dosyaları arasındaki ilişkiyi dahil olduğunu varsayalım

<bindings schemaLocation="../party.xsd" version="1.0" node="/xs:schema"> 
    <bindings node="//xs:complexType[@name='FixedIncomeBook']"> 
     <class name="PartyFixedIncomeBook"/> 
    </bindings> 
</bindings> 
+0

bu değil midir vs. b.xsd işlemek için bu bölümü kullanın? –

+0

Bu, oluşturulan java sınıfını yeniden adlandırıyor. Varsayılan olarak "FixedIncomeBook.java" elde edersiniz ve bu bağlama ile PartyFixedIncomeBook.java ' –

+0

elde ederim: [ERROR] Desteklenmeyen ciltleme ad alanı "". Belki "http://java.sun.com/xml/ns/jaxb/xjc" kastettin mi? Dosyanın satır 4: sorunun nerede olduğunu se miyim? –

2

itibaren. Ayrıca, içeriğin çakıştığı sınıfları yeniden kullanmaya çalıştığınızı varsayalım.

Kolay bir çıkış yolu, her dosyayı bağımsız olarak "derlemek" ve her bir XSD dosyası için farklı bir Java paketi sağlamaktır. Buradaki problem, bir XML'den diğerine ("A'dan ve B'den marshall'a), sonra da com.A paketindeki C1 sınıfına ve paket com.B'deki C1 sınıfına" zincirleme "yapmayı denemenizdir. Aynı XSD karmaşık tipine uyan, "değiştirilebilir" değildir; aralarında bir dönüşüm geliştirmeniz gerekecek. Özel bir bağlama dosyasına ihtiyacınız var ya da NetBeans kullanıyorsanız, JAXB sihirbazında farklı paketler ayarlamanız yeterlidir.

Bölümleri kullanmak en iyi yol olabilir (bkz. this on SO). Süreç a.xsd ardından çıktıkları zaman acually XML öğelerini yeniden adlandırma, yoksa sadece oluşturulur javaclasses yeniden adlandırma olduğunu

+0

1. Hayır içerme yok. 2. Evet, aynı oldukları için yeniden kullanmak istiyorum, ancak bu birincil amaç değildir, bu nedenle başka bir şey yapmak daha kolay ise o zaman öyle olsun. C.xsd'deki A.xsd'den bir şeyle ilgilenmiyorum, sadece hepsini aynı projede kullanıyorum. Xsd'leri aynı TNS'den gelse bile paketleri ertelemenin doğru bir yolu var mı? –

+0

@Sofus, o zaman neden bölüm kullanmıyorsunuz? Ya da her bir pakete karşı xjc'yi farklı ad alanlarını hedefleyen özel bir bağlayıcı kullanarak çalıştırın? –

+0

20 saat içinde denemeye çalışacağım, –