2012-05-02 31 views
8

Tôi đã thực hiện rất nhiều tìm kiếm và không thể tìm thấy ví dụ ngắn gọn về cách ánh xạ lược đồ XML tới các đối tượng miền hiện có thay vì tạo các đối tượng miền mới sử dụng xjc. Tôi đã tạo ra một tập tin bindings (xjb) nhưng vẫn không thể tìm thấy cách nào để hoàn thành việc này.JAXB xjc ánh xạ tới các đối tượng miền hiện có

Nếu tôi có một Object miền hiện có mà tôi muốn JAXB sử dụng như sau:

package com.blah.domain; 
class CustomerOffice{ 
    private int id; 
    private String name; 
    private String phone; 
} 

Và tôi có một Schema XML như sau:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:www="http://www.blah.com" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.blah.com" elementFormDefault="unqualified"> 
    <xs:element name="Customer"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="id" type="xs:int" nillable="false" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="name" type="xs:string"/> 
      <xs:element name="city" type="xs:string"/> 
      <xs:element name="CustomerOffice" type="www:CustomerOffice" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:complexType name="CustomerOffice"> 
     <xs:sequence> 
     <xs:element name="name" type="xs:string"/> 
     <xs:element name="length" type="xs:int"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

Nếu tôi đi đến tạo các lớp JAXB với xjc nó sẽ tạo một lớp mới có tên là Customer (mà tôi muốn). Nó cũng sẽ tạo một lớp mới có tên là CustomerOffice (mà tôi không muốn, tôi muốn nó sử dụng đối tượng miền hiện có của tôi).

Vì vậy, thay vì lược đồ trỏ đến "loại: www: CustomerOffice", tôi muốn sử dụng số hiện tại com.blah.domain.CustomerOffice.

Tôi đã cố gắng làm ví dụ đơn giản này càng tốt, bất kỳ trợ giúp nào đều được đánh giá cao.

Trả lời

11

Bạn có thể sử dụng tệp ràng buộc bên ngoài để định cấu hình XJC để thực hiện những gì bạn muốn.

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

    <jxb:bindings schemaLocation="yourSchema.xsd"> 
     <jxb:bindings node="//xs:complexType[@name='CustomerOffice']"> 
      <jxb:class ref="com.blah.domain.CustomerOffice"/> 
     </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

XJC Gọi

xjc -d outputDir -b binding.xml yourSchema.xsd 
+2

đó đã làm việc hoàn hảo! Cảm ơn bạn rất nhiều, hy vọng điều này sẽ giúp một số người khác đã đấu tranh với điều này. – colbyjax