2015-01-07 45 views
0

(我已經GOOGLE了它,在這裏做了搜索,發現沒有答案,也許我使用了錯誤的關鍵字...)JAXB/XJC外部約束力重命名與多XSD編譯

要使它簡單,我有兩個模式:

a.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://foo.bar/something" 
    targetNamespace="http://foo.bar/something" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified"> 

    <xs:complexType name="TFoo"> 
    <xs:attribute name="version" type="xs:string" /> 
    </xs:complexType> 
</xs:schema> 

b.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://foo.bar/something" 
    targetNamespace="http://foo.bar/something" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified"> 

    <xs:complexType name="TFoo"> 
    <xs:attribute name="version" type="xs:string" /> 
    <xs:attribute name="dateTime" type="xs:dateTime" /> 
    </xs:complexType> 
</xs:schema> 

兩者都有相同的目標名稱空間和名爲TFoo的complexType。

我有一個外部結合到從TFoo改變a.xsd的生成的類名稱,以TFooA

一個-binding.xml

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    version="2.1"> 

    <jxb:bindings schemaLocation="a.xsd"> 
    <jxb:bindings node="//xs:complexType[@name='TFoo']"> 
     <jxb:class name="TFooA"/> 
    </jxb:bindings> 
    </jxb:bindings> 

</jxb:bindings> 

其如果我編譯a.xsd單獨工作

$ xjc -b a-binding.xml a.xsd 
parsing a schema... 
compiling a schema... 
bar/foo/something/ObjectFactory.java 
bar/foo/something/TFooA.java 
bar/foo/something/package-info.java 

(看我是如何得到TFoo 一個的.java

但是,如果我嘗試一次編譯兩種模式中,我得到:

$ xjc -b a-binding.xml a.xsd b.xsd 
parsing a schema... 
[ERROR] 'TFoo' is already defined 
    line 13 of file:/home/scherrer/tmp/PL_008f/b.xsd 

[ERROR] (related to above error) the first definition appears here 
    line 9 of file:/home/scherrer/tmp/PL_008f/a.xsd 

Failed to parse a schema. 

我知道TFoo定義了兩次,這就是爲什麼我有外部綁定來解決衝突。

Obs。這兩種模式都是虛構的,是爲了舉例說明問題,而真正的模式(很多)是由第三方提供的,我不能改變它們。

任何人都可以告訴我,如果這是某種xjc限制(它沒有列出here)或根本不應該工作嗎?或者也許是一個錯誤?

在此先感謝。

+0

總之,無法將這兩個模式編譯在一起,因爲此組合無效。 – lexicore

回答

2

有兩個不同的模式文檔定義相同的名稱空間(甚至更糟 - 相同的元素)相當於有2個不同的瓶子在包中包含相同的包和相同的類。這不是jaxb本身的限制 - 它違反了模式名稱空間的含義。

總之,你不能一起處理這些模式。

生成器無法創建類,因爲它不知道要引用的內容。嘗試重命名之前發生失敗。它在閱讀模式時發生。

你可以做的是分別處理模式並更改所使用的java包名。這避免了java包空間中的命名衝突,基本上將模式文檔視爲完全獨立的實體,彼此之間沒有引用。這可以通過定義要在綁定中使用的包名來完成:

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    version="2.1"> 
    <jxb:bindings schemaLocation="a.xsd" node="/xs:schema"> 
     <jxb:schemaBindings> 
     <jxb:package name="com.foo.a"></jxb:package> 
     </jxb:schemaBindings> 
    </jxb:bindings> 
</jxb:bindings> 
+0

在我的情況下,單獨編譯的問題是兩個模式都包含第三個模式,可以說** types.xsd **,它聲明瞭許多其他模式中使用的許多常見類型,並且猜測它使用* *同樣的targetNamespace **。所以,如果我單獨編譯,最終會得到十幾個不同pkgs中重複的類。我嘗試過使用** episode **擴展,爲** types.xsd **生成一個插曲文件,但是(當我嘗試使用它時,我想是因爲有相同的targetNamespace)(可以說'xjc -extension - b types.episode a.xsd'),什麼也沒有生成。 – fscherrer

+0

這只是模式名稱空間的完全錯誤。使用jaxb的唯一方法是使用types.xsd和force java name space 1來生成a.xsd,並使用types.xsd生成b.xsd。 –

+0

「force java name space 1」是什麼意思?對不起,沒有得到。我認爲我用** episode ** s解決了問題,改變了生成的_episode_文件(''而不是'false')。還有另外一個問題,那是因爲我還沒有提到這個場景的另一部分。我正在完成我的測試(用真實場景),所以我可以用我得到的結果更新問題。我接受你的答案,因爲它回答了這個問題。 – fscherrer

-1

我認爲您發現數據綁定的限制。改爲嘗試data projection披露:我與該項目有關)。 您的模式b.xsd看起來就像是a.xsd的擴展。您可以創建適合b.xsd的投影界面,並將其用於任何符合a.xsd或b.xsd的文檔。

+0

你或你不附屬於這個數據放映庫嗎? – lexicore

+0

是的,我是。這是否會在任何方向上改變答案的用處?恕我直言,是的,因爲我知道我在說什麼。 – Cfx

+0

我的觀點是你[必須透露你的聯盟](http://stackoverflow.com/help/behavior)。 – lexicore