Bạn có biết về cài đặt JAXB để ngăn chặn standalone = "yes" được tạo trong XML kết quả không?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Bạn có biết về cài đặt JAXB để ngăn chặn standalone = "yes" được tạo trong XML kết quả không?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Câu trả lời:
Thuộc tính này:
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);
... có thể được sử dụng để không có:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Tuy nhiên, tôi sẽ không coi đây là phương pháp hay nhất.
trong JAXB là một phần của JDK1.6
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
standalone
thuộc tính trong khai báo XML.
Bạn có thể sử dụng
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
hoặc là
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false)
để tắt khai báo XML mặc định, rồi thêm khai báo XML tùy chỉnh của bạn,
<?xml version="1.0" encoding="UTF-8"?>
bởi
marshaller.setProperty("com.sun.xml.bind.xmlHeaders",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
vào xml được tạo, do đó tránh thuộc tính standalone = "yes" .
Nếu bạn làm cho tài liệu phụ thuộc vào DOCTYPE
(ví dụ: sử dụng các 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, XML độc lập có thể được sử dụng ở bất cứ đâ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 bên ngoài.
Tôi không hiểu tuyên bố này có thể là một vấn đề như thế nào, ngoài khả năng tương tác với phần mềm không hỗ trợ XML, nhưng một số món súp regex khủng khiếp.
DOCTYPE
?
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ể bị xóa để chỉ lấy phần xml còn lại
Nếu bạn đang chỉ sử dụng gói javax.xml mặc định, bạn có thể đặt tùy chọn JAXB_FRAGMENT của bộ điều phối 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 của riêng bạn:
xmlStreamWriter.writeProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
jaxbMarshaller.setProperty( Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.marshal(object, xmlStreamWriter);
xmlStreamWriter.writeEndDocument();
Bạn có thể sử dụng: marshaller.setProperty ("jaxb.fragment", Boolean.TRUE);
Nó hoạt động với tôi trên Java 8
Tôi không có "uy tín" đủ cao để có "đặc quyền" bình luận. ;-)
@Debasis, lưu ý rằng thuộc tính bạn đã chỉ đị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 thuộc tính "nội bộ" như bạn đã làm, tôi nhận được một javax.xml.bind.PropertyException
Trong trường hợp bạn nhận được thuộc tính ngoại lệ, hãy thêm cấu hình sau:
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlDeclaration", Boolean.FALSE);
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
Tôi đang sử dụng Java 1.8 và JAXB 2.3.1
Đầu tiên, hãy đảm bảo đang sử dụng java 1.8 trong pom.xml
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
Sau đó, trong mã nguồn tôi đã sử dụng: (khóa là phần bên trong)
// remove standalone=yes
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
thử xem
private String marshaling2(Object object) throws JAXBException, XMLStreamException {
JAXBContext jaxbContext = JAXBContext.newInstance(object.getClass());
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
StringWriter writer = new StringWriter();
writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
jaxbMarshaller.marshal(object, writer);
return writer.toString();
}
Nếu bạn có <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
nhưng muốn điều này: <?xml version="1.0" encoding="UTF-8"?>
Cứ làm đi:
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");