2012-03-20 60 views
4

我有一個xsd,它具有導入其他xsd文件的典型導入語句,但不幸的是,這些引用是硬編碼路徑。有沒有辦法在JAXB中使用xbj文件覆蓋那些導入的位置?jaxb - 如何將xsd文件映射到URL以找到它們

所有這些xsds通過另一個jar(在jar中)傳遞,所以我想從classpath中獲得一個,當它導入其他jar時,嘗試對其進行配置,以便將其他類從classpath中取出。

感謝, 院長

回答

9

有一些你可以用它來解決這一問題的技術:

目錄

你可以用目錄文件覆蓋模式位置。下面是幾個例子:

使用取決於命名空間中的另一個模式:

PUBLIC "http://example.org/A" "others/schema_a.xsd" 

使用取決於模式位置另一個模式:

REWRITE_SYSTEM "https://example.org/a.xsd" "others/schema_a.xsd" 

允許使用的本地副本模式文件。

請參閱thisthis指南。不幸的是,XJC中的目錄支持並不總是按預期工作,並且調試它有點困難。

從Maven構件

解決模式如果你使用Maven的時候,你可以使用Maven的JAXB2-插件,它可以Maven工件內解決模式:

REWRITE_SYSTEM "https://example.org/a.xsd" "maven:org.example:a!/a.xsd" 

在聯合目錄,您可以使內的JAXB使用a.xsd而不是https://example.org/a.xsd

看到這些示例項目:

1

您可以嘗試使用XJC交互編程(見下文)和插件在自己的EntityResolver解析XML模式:

import com.sun.codemodel.*; 
import com.sun.tools.xjc.*; 
import com.sun.tools.xjc.api.*; 

SchemaCompiler sc = XJC.createSchemaCompiler(); 
sc.setEntityResolver(new YourEntityResolver()); 
sc.setErrorListener(new YourErrorListener()); 
sc.parseSchema(SYSTEM_ID, element); 
S2JJAXBModel model = sc.bind(); 

下面是相關鏈接回答我了,有些人發現有用:

+0

編程使用?即使標準XJC支持目錄,也不需要如此深刻的影響。 – lexicore 2012-03-21 10:55:17

+0

@lexicore - 我的第一個雖然是XML目錄(http://blog.bdoughan.com/2011/10/jaxb-xjc-imported-schemas-and-xml.html)。建議編程方法的原因是,真正的模式存在於類路徑中的jar中,並且這些位置可能無法通過XML目錄配置。 – 2012-03-21 14:02:35

+0

提取JAR也是一種選擇。 :) – lexicore 2012-03-21 14:33:28