2011-12-15 26 views
5

Tôi đang cố gắng sắp xếp một tập tin bằng cách sử dụng Visio XML Schema, trong đó bao gồm 3 file schema và tạo ra ba gói khi nguồn java được tạo ra với XJC:JAXB bị nhầm lẫn về các phần tử gốc?

  • com.microsoft.schemas.visio._2003.core
  • com.microsoft.schemas.visio._2006.extension
  • com.microsoft.schemas.office.visio._2010.extension

phần tử gốc là VisioDocument, và tất cả các lớp học tôi đang sử dụng nằm trong sốGói.

Đây là cách tiếp cận của tôi để marshalling tập tin XML của tôi:

VisioDocumentType visioDoc = new VisioDocumentType(); 
... manipulated here ... 
JAXBContext jc = JAXBContext.newInstance("com.microsoft.schemas.visio._2003.core"); 
Marshaller m = jc.createMarshaller(); 
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
m.marshal(new JAXBElement<VisioDocumentType>(new QName("uri","local"), VisioDocumentType.class, visioDoc), bw); 

Khi thực hiện, tôi nhận được lỗi này:

javax.xml.bind.MarshalException 
- with linked exception: 
[com.sun.istack.internal.SAXException2: unable to marshal type "com.microsoft.schemas.visio._2003.core.PagePropsType" as an element because it is missing an @XmlRootElement annotation] 

Tôi đang sử dụng PagePropsType, nhưng nó không phải là một phần tử gốc. Tại sao JAXB lại nghĩ như vậy?

+0

Làm thế nào là tài sản mà bạn đang thiết lập các ví dụ của 'com.microsoft.schemas.visio._2003.core.PagePropsType' trên chú thích ? –

+0

'@XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "PageProps_Type", propOrder = { "pageWidthOrPageHeightOrShdwOffsetX" }) 'Đó có phải là những gì bạn đang tìm kiếm không? – Chris

+0

Tôi có nghĩa là tài sản bạn đang thiết lập dụ lên và không phải là 'PagePropsType' chính nó. –

Trả lời

2

Sự cố nằm trong phần ... manipulated here ... mã của bạn.

Dựa trên giả định rằng bạn thực hiện các thao tác sau (hoặc điều gì đó tương tự).

// you create a page prop 
PagePropsType pageProps = ... 

// then you feed it to a shape sheet 
ShapeSheetType shapeSheet = ... 
shapeSheet.getTextOrXFormOrLine().add(pageProps); 

(ShapeSheetType là một lớp cha cho StyleSheetType, vân vân.)

Nếu đây là trường hợp, sau đó vấn đề của bạn nằm trong việc thêm các pageProps vào danh sách trực tiếp.

Nếu bạn xem qua tài liệu của phương pháp getTextOrXFormOrLine(), danh sách này liệt kê các loại danh sách có thể chứa. Mỗi loại được gói trong một JAXBElement<...> vì vậy bạn phải quấn pageProps trước khi thêm nó vào danh sách.

Bạn nên làm điều đó như thế này:

ObjectFactory objectFactory = new ObjectFactory(); 
JAXBElement<PagePropsType> pagePropsElement = objectFactory.createShapeSheetTypePageProps(pageProps); 

(Lưu ý rằng tôi đã sử dụng XJC 2.2.4 để biên dịch các lược đồ, vì tôi mỗi tên lớp được với hậu tố Type Có lẽ đây là lý do tại sao. tôi đã kết thúc với VisioDocumentType thay vì VisioDocument như bạn, nhưng nó không phải vấn đề.)

+0

Điều này dường như là những gì tôi đã mất tích, cảm ơn. (thiếu 'Type' là lỗi đánh máy) – Chris

1

Nếu bạn kiểm tra mã được tạo, bạn sẽ tìm thấy một lớp học ObjectFactory trong đó. Lớp này phải có phương thức trả về một VisioDocument được gói trong một JAXBElement và rằng đó là đối tượng mà bạn muốn chuyển cho trình so khớp.

Tương tự áp dụng cho tất cả các đối tượng bạn đặt bên trong VisioDocument - không tạo chúng bằng 'new' nhưng sử dụng ObjectFactory.

+0

Tôi đã làm điều này nhưng vấn đề vẫn còn. – Chris

+0

_Same áp dụng cho tất cả các đối tượng bạn thiết lập bên trong VisioDocument - không tạo chúng với 'mới' nhưng sử dụng ObjectFactory._ Theo ý kiến ​​của tôi 'ObjectFactory' nên và phải được sử dụng _only_ nếu ta phải tạo một kiểu bọc trong' JAXBElement <...> ', nếu không nó chỉ gây ô nhiễm mã. Các phương thức như 'createXxxType' trong' ObjectFactory' chỉ gọi 'new XxxType()'. –