2010-04-26 29 views
9

Tôi đang sử dụng xjc để tạo các lớp Java từ lược đồ XML và sau đây là một đoạn trích của XSD.Lược đồ XML cho các lớp Java với XJC

<xs:element name="NameInfo"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:choice> 
     <xs:element ref="UnstructuredName"/> <!-- This line --> 
     <xs:sequence> 
      <xs:element ref="StructuredName"/> 
      <xs:element ref="UnstructuredName" minOccurs="0"/> <!-- and this line! --> 
     </xs:sequence> 
     </xs:choice> 
     <xs:element ref="SomethingElse" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Đối với hầu hết các phần các lớp học tạo ra cũng tốt nhưng đối với khối trên, chúng tôi sẽ nhận được một cái gì đó như:

public List<Object> getContent() { 
    if (content == null) { 
    content = new ArrayList<Object>(); 
    } 
    return this.content; 
} 

với những nhận xét sau đây trên nó:

* You are getting this "catch-all" property because of the following reason: 
* The field name "UnstructuredName" is used by two different parts of a schema. See: 
* line XXXX of file:FILE.xsd 
* line XXXX of file:FILE.xsd 
* To get rid of this property, apply a property customization to one 
* of both of the following declarations to change their names: 
* Gets the value of the content property. 

Tôi có đặt một bình luận ở cuối của hai dòng trong câu hỏi.

Hiện tại, tôi không nghĩ sẽ dễ thay đổi lược đồ vì điều này đã được quyết định giữa các nhà cung cấp và tôi không muốn đi tuyến đường này (nếu có thể) vì nó sẽ làm chậm tiến độ một chút.

Tôi đã tìm kiếm và đã tìm thấy this page, là tùy chỉnh bên ngoài những gì tôi muốn làm? Tôi chủ yếu làm việc với các lớp được tạo nên tôi không hoàn toàn quen thuộc với quy trình tạo ra các lớp này. Một ví dụ đơn giản về "tùy biến thuộc tính" sẽ là tuyệt vời! Phương pháp thay thế tạo ra các lớp Java sẽ là tốt miễn là lược đồ vẫn có thể được sử dụng.

EDIT: Tôi nên làm rõ rằng hai UnstructuredName thực sự là cùng một yếu tố.

Trả lời

1

Vấn đề quan trọng ở đây là bạn có một <xs:sequence> bao gồm một <xs:choice>, dịch trong Java thành "một số List của sự vật". Cấu trúc kiểu Java không đủ linh hoạt để thể hiện điều này tốt hơn.

Tùy chỉnh ràng buộc có thể giúp bạn, nhưng trong trường hợp này, tôi nghi ngờ là không, vì tôi không thể thấy cách tốt hơn để thể hiện thông tin này. Một kỹ thuật thay thế mà tôi đã sử dụng trong quá khứ là chuyển lược đồ thông qua một phép biến đổi XSLT đơn giản trước, sắp xếp lại các thành phần thành một cái gì đó thân thiện với JAXB hơn, trong khi vẫn cho phép các cấu trúc tương tự mà tài liệu sẽ có trong thực tế . Bằng cách này, bạn có thể "thay đổi" lược đồ mà không thay đổi bản gốc.

+0

Tôi không hoàn toàn chắc chắn cách sắp xếp lại các yếu tố có thể giúp đỡ trong trường hợp này. Nếu tôi có thể "chuỗi" bên trong thành phần tử khác, vấn đề này sẽ được giải quyết? Điều đó có khả thi với sự biến đổi không? Nếu tôi thực hiện một số phép biến đổi, tôi sẽ cần một biến đổi thành một cấu trúc mà tôi thích và sau đó thực hiện một phép chuyển đổi khác trở lại cấu trúc ban đầu của nó? – nevets1219

2

Tôi đã gặp sự cố tương tự. Tôi chuyển sang xmlbeans và trục. XMLBeans có thể biên dịch lược đồ của bạn mà không gặp vấn đề gì và không có đau đầu. JaxB không thể xử lý điều này. Để JaxB xử lý điều này, bạn có thể thay đổi lược đồ của mình một chút.

<xs:sequence> 
      <xs:choice> 
    <!-- changed the following line --> 
      <xs:element name="UnstructuredTop" type="UnstructuredName"/> 
    <!-- end of change --> 
      <xs:sequence> 
       <xs:element ref="StructuredName"/> 
       <xs:element ref="UnstructuredName" minOccurs="0"/> 
      </xs:sequence> 
      </xs:choice> 
      <xs:element ref="SomethingElse" minOccurs="0"/> 
    </xs:sequence> 

Sau đó, JaxB sẽ phân biệt hai và không lật ra.

Tuy nhiên, tình huống của bạn cũng giống như tình huống của tôi. Thay đổi lược đồ đã được ra khỏi câu hỏi. Vì vậy, tôi đã đi với xmlBeans và trục (mà sux).

5

Bạn cũng có thể sử dụng một tùy ràng buộc gọi là <xjc:simple />:

<?xml version="1.0" encoding="UTF-8"?> 
<jxb:bindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
       jxb:version="2.0"> 
     <jxb:globalBindings> 
      <xjc:simple /> 
     </jxb:globalBindings> 
</jxb:bindings> 

tuy nhiên Xin được adviced rằng đây là nhà cung cấp cụ thể (người sử dụng một cái gì đó khác hơn XJC dù;))

More Info here

0

Tôi đã tạo một lớp trình bao bọc để giải quyết vấn đề:

List<JAXBElement<?>> contentList = address.getContent(); 
if (contentList != null && contentList.size() > 0) { 
    Address4JaxbMula address4JaxbMula = new Address4JaxbMula(contentList); 

... }

...

public static class Address4JaxbMula { 
    public CountryCodeType countryCode; 
    public AddressFixType addressFix; 
    public String addressFree; 

    public Address4JaxbMula(List<JAXBElement<?>> contentList) { 
     if (contentList != null && contentList.size() > 0) { 
      for (JAXBElement<?> content : contentList) { 
       Object value = content.getValue(); 
       if (value.getClass().isAssignableFrom(CountryCodeType.class)) { 
        countryCode = (CountryCodeType) content.getValue(); 
       } else if (value.getClass().isAssignableFrom(AddressFixType.class)) { 
        addressFix = (AddressFixType) content.getValue(); 
       } else { 
        addressFree = (String) value; 
       } 
      } 
     } 
    } 

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