2010-05-04 30 views
10

Tôi có một tệp CommonTypes.xsd mà tôi bao gồm trong tất cả các XSD khác của tôi bằng cách sử dụng xs: include. Tôi nhận đượcBiên dịch nhiều lược đồ thành các gói khác nhau bằng cách sử dụng JAXB 2.1

Multiple <schemaBindings> are defined for the target namespace "" 

khi tôi cố gắng biên dịch nó thành các gói khác nhau bằng tệp ràng buộc. Vui lòng cho tôi biết liệu có cách nào để biên dịch chúng thành các gói khác nhau hay không. Tôi đang sử dụng JAXB 2.1

+0

Vui lòng thêm một tập tin bắt buộc ví dụ cho câu hỏi của bạn – skaffman

Trả lời

4

Tôi đã gặp cùng một vấn đề và đã không giải quyết được chưa, nhưng tôi sợ rằng nó không thể là có thể tạo ra XSD vào differents gói:

nó không phải là quy phạm pháp luật để có nhiều hơn một < jaxb: schemaBindings> mỗi namespace, vì vậy nó không thể có hai schemas trong không gian tên cùng một mục tiêu biên soạn thành các gói Java khác nhau

từ Compiler Restrictions at the end of this page

nhưng nếu một số người tìm thấy một số công việc xung quanh, chỉ cần thông báo cho chúng tôi xin vui lòng

6

Vâng, có một cách.
Giả sử:

xsd/common/common.xsd 
xsd/foo/foo.xsd 

Ở nơi thư mục chung common.xjb:

<jxb:schemaBindings> 
    <jxb:package name="mypkg.common"> 
    </jxb:package> 
</jxb:schemaBindings> 

Ở nơi thư mục foo foo.xjb:

<jxb:schemaBindings> 
    <jxb:package name="mypkg.foo"> 
    </jxb:package> 
</jxb:schemaBindings> 

Trong tập tin build.xml, tạo một nhiệm vụ XJC cho mỗi :

<xjc destdir="${app.src}" readOnly="true" package="mypkg.common"> 
    <schema dir="${app.schema}/common" includes="*.xsd" /> 
    <binding dir="${app.schema}/common" includes="*.xjb" /> 
</xjc> 
<xjc destdir="${app.src}" readOnly="true" package="mypkg.foo"> 
    <schema dir="${app.schema}/foo" includes="*.xsd" /> 
    <binding dir="${app.schema}/foo" includes="foo.xjb" /> 
</xjc> 

Bạn cần đảm bảo rằng common.xsd có một số targetNameSpace khác với foo.xsd 's targetNameSpace.

+0

ick, là có cách nào để có một tập tin xjb? Chúng tôi có 20 xsds vì vậy tôi ghét có 20 tệp xjb. –

+0

Có - bạn có thể có nhiều trong một tệp .xjb duy nhất. – tdrury

+0

@tdrury no, không thể khi '' tham chiếu đến cùng 'targetnamespace'. – ulab

6

Như đã nêu bởi Ben không có cách nào để làm điều đó nếu chúng có cùng một không gian tên. Nhưng làm thế nào để làm điều đó nếu bạn có không gian tên khác nhau?

<jxb:bindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" > 
    <jxb:bindings namespace="http://www.openapplications.org/oagis/9/unqualifieddatatypes/1.1" schemaLocation="oagi/Common/UNCEFACT/ATG/CoreComponents/UnqualifiedDataTypes.xsd" > 
     <jxb:schemaBindings> 
      <jxb:package name="com.test.oagi.udt"/> 
     </jxb:schemaBindings> 
    </jxb:bindings> 
    <jxb:bindings namespace="http://www.openapplications.org/oagis/9/codelists" schemaLocation="oagi/Common/OAGi/Components/CodeLists.xsd" > 
     <jxb:schemaBindings> 
      <jxb:package name="com.test.oagi.cl"/> 
     </jxb:schemaBindings> 
    </jxb:bindings> 
</jxb:bindings> 

nhưng đảm bảo bạn không sử dụng thông số dòng lệnh -p, vì điều đó sẽ ghi đè cấu hình của bạn.

3

Tôi biết nó là một bài cũ, nhưng, như không có câu trả lời cho câu hỏi chính xác, đây là đề nghị của tôi:

Như mmoossen giải thích, thủ đoạn này là để xác định không gian tên khác nhau cho các XSD. Nhưng, thêm một thuộc tính namespace trong thẻ jxb:bindings không hoạt động:

<jxb:bindings namespace="http://www.openapplications.org/oagis/9/unqualifieddatatypes/1.1" schemaLocation="oagi/Common/UNCEFACT/ATG/CoreComponents/UnqualifiedDataTypes.xsd" > 

Thay vì đó, bạn cần phải thêm một thuộc tính targetNamespace đến xs:schema thẻ của XSD của bạn:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" attributeFormDefault="unqualified" 
    targetNamespace="some.namespace" 
    version="1.0"> 

Sau khi hoàn tất, bạn sẽ có thể có 1 tệp tuỳ chỉnh bên ngoài (.xjb) tuyên bố khác nhau schemaBindings, mỗi người trong số họ có thể sử dụng một gói phần mềm khác nhau:

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings version="2.1" 
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd" 
       jaxb:extensionBindingPrefixes="xjc annox inherit"> 


    <jaxb:bindings schemaLocation="MyFirstXSD.xsd"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="com.test.a" /> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 

    <jaxb:bindings schemaLocation="MySecondXSD.xsd"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="com.test.b" /> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 

    <jaxb:bindings schemaLocation="MyThirdXSD.xsd"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="com.test.c" /> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 

</jaxb:bindings> 
+0

đã làm việc cho tôi ... cảm ơn! –

Các vấn đề liên quan