2008-11-10 21 views

Trả lời

52
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE); 

có thể được sử dụng để không có

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 

Tuy nhiên tôi wouldnt xem xét thực tiễn tốt nhất này.

+2

Cảm ơn, đây chính xác là những gì tôi cần. Tôi đồng ý rằng cách tốt nhất là bao gồm cả dòng, nhưng một dịch vụ web mà tôi đang giao tiếp không mong đợi nó. – jgrowl

+6

Tốt là nó hoạt động, nhưng FWIW, dịch vụ bị hỏng nếu nó không thể chấp nhận xml hợp pháp, do đó, có thể tốt để gửi báo cáo lỗi chống lại nó. – StaxMan

+4

Không hoạt động với JAXB trong JDK1.6. Xem câu trả lời đúng của so_mv để có giải pháp đúng. – sversch

3

Nếu bạn tạo tài liệu phụ thuộc vào DOCTYPE (ví dụ: sử dụng thực thể được đặt tên) thì nó sẽ ngừng độc lập, do đó, standalone="yes" sẽ không được phép trong khai báo XML.

Tuy nhiên, độc lập XML có thể được sử dụng ở bất kỳ đâu (trong khi không độc lập là vấn đề đối với các trình phân tích cú pháp XML không tải các phần tử bên ngoài).

Tôi không thấy cách tuyên bố này có thể là một vấn đề, ngoại trừ khả năng tương tác với phần mềm không hỗ trợ XML, nhưng một số voodoo giống như XML bị hỏng trong nhà.

+1

Chính xác, bất kỳ hệ thống xử lý bị cáo buộc xml nào mà barfs trên khai báo xml có vẻ rất đáng ngờ. – StaxMan

+0

Cách nào nó trả lời câu hỏi? – fnt

99

trong JAXB là một phần của JDK1.6

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 
+2

Đây là câu trả lời đúng cho JDK1.6. – sversch

+5

Điều này không cho kết quả mong đợi. Điều này loại bỏ tất cả các dòng khai báo XML. Những gì tôi muốn chỉ là loại bỏ thuộc tính 'standalone' trong khai báo XML. –

+0

Nếu bạn tự hỏi tại sao điều này không hiệu quả đối với bạn, giống như tôi đã làm, thì câu trả lời là hiệu ứng phụ thuộc vào api nguyên so bạn đang sử dụng. Đối với nguyên soái (Object, Outputstream) và nguyên soái (Object, Writer), nó hoạt động như được gợi ý ở đây. Đối với nguyên soái (Object, Node) nó không có hiệu lực. Đối với các tác động api nguyên soái còn lại có một cái nhìn [ở đây] (https://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/Marshaller.html) trong phần Thuộc tính được hỗ trợ. –

52

Bạn có thể sử dụng

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 

hoặc

marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE) 

để vô hiệu hóa khai báo XML mặc định, và sau đó thêm bạn khai báo XML tùy chỉnh,

<?xml version="1.0" encoding="UTF-8"?> 

bởi

marshaller.setProperty("com.sun.xml.bind.xmlHeaders", 
     "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 

để xml tạo ra, do đó tránh độc = "yes" tài sản.

+2

"setProperty" với "xmlDeclaration" phát nổ trong chuyến bay: ngoại lệ. –

+2

Dòng "setProperty" với "xmlHeaders" cũng không thành công. PropertyException. Đây không phải là giải pháp. –

+0

bạn đang sử dụng phiên bản java và jaxb nào? – WarFox

2
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>"); 

Điều này làm việc cho tôi với JDK1.7. standalone = \ "no \" có thể được xóa để chỉ còn lại phần xml

0

Tôi không có "danh tiếng" đủ cao để có "đặc quyền" để nhận xét. ;-)

@Debasis, lưu ý rằng tài sản mà bạn đã quy định:

"com.sun.xml.internal.bind.xmlHeaders" 

nên là:

"com.sun.xml.bind.xmlHeaders" (without the "internal", which are not meant to be used by the public) 

Nếu tôi sử dụng "nội bộ" tài sản như bạn đã làm, tôi nhận được a javax.xml.bind.PropertyException

3

chỉ nếu ai đó đang vẫn struggeling với vấn đề này, bạn có thể xem xét sử dụng

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 

để loại bỏ tất cả các khai báo XML và chỉ viết riêng String của bạn vào đầu dòng đầu ra/phương pháp của bạn

2

Nếu bạn chỉ sử dụng gói javax.xml mặc định, bạn có thể đặt tùy chọn JAXB_FRAGMENT của trình soạn thảo thành 'true' (điều này bỏ qua hướng dẫn xử lý xml mặc định) và sử dụng phương thức writeProcessingInstruction của XMLStreamWriter để chèn riêng của bạn :

xmlStreamWriter.writeProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\""); 
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 
jaxbMarshaller.marshal(object, xmlStreamWriter); 
xmlStreamWriter.writeEndDocument();