Xóa 'standalone = “yes”' khỏi XML đã tạo


82

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"?>

7
Tại sao đó là một vấn đề?
Kornel 14/12/08

@Kornel trong dự án của tôi mà để sử dụng với Tibco và WebMethod, nó sẽ tạo ra lỗi vì không nhận dạng được standalone = yes
aswzen

Câu trả lời:


62

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.


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 dòng, nhưng một dịch vụ web mà tôi đang giao tiếp không mong đợi điều đó.
jgrowl

6
Tốt là nó hoạt động tốt, nhưng FWIW, dịch vụ bị hỏng nếu nó không thể chấp nhận xml hợp pháp, vì vậy có lẽ 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 của so_mv để biết giải pháp chính xác.
sversch

1
Điều đó phát nổ trong chuyến bay: ngoại lệ.
Nicolas Barbulesco

1
@sversch: bạn có thể thử lớp thuộc tính: "com.sun.xml.internal.bind.xmlHeaders"
baybora.oren

120

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

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

13
Điều này không cho kết quả như mong đợi. Thao tác này sẽ xóa tất cả dòng khai báo XML. Những gì tôi muốn chỉ là loại bỏ standalonethuộc tính trong khai báo XML.
Nicolas Barbulesco

Nếu bạn tự hỏi tại sao điều này không hiệu quả với bạn, giống như tôi đã làm, thì câu trả lời là hiệu quả phụ thuộc vào việc bạn đang sử dụng api soái ca nào. Đối với nguyên soái (Đối tượng, Dòng đầu ra) và nguyên soái (Đối tượng, Người viết), điều này hoạt động như được đề xuất ở đây. Đối với nguyên soái (Đối tượng, Nút) nó không có tác dụng. Đối với các hàm ý api thống chế còn lại, hãy xem ở đây trong phần Thuộc tính được hỗ trợ.
Lasse Samson

59

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" .


2
"SetProperty" với "xmlDecosystem" phát nổ trong chuyến bay: ngoại lệ.
Nicolas Barbulesco

2
Dòng "setProperty" với "xmlHeaders" cũng không thành công. PropertyException. Vì vậy, đây không phải là một giải pháp.
Nicolas Barbulesco

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

@WarFox Lệnh setProperty với xmlHeaders không hoạt động với jdk1.6.0_24 và JAXB phiên bản 2.1
Bryan Larson

3
Bất kể java6 hay java7, tôi phải thêm 'nội bộ', tức là marshaller.setProperty ("com.sun.xml.internal.bind.xmlHeaders", "<? Xml version = \" 1.0 \ "encoding = \" UTF-8 \ "?>");
Caoilte

7

chỉ cần người khác vẫn đang đấu tranh với vấn đề này, bạn có thể cân nhắc sử dụng

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

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


5

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.


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

1
Nó trả lời câu hỏi theo cách nào?
ᄂ ᄀ

Làm thế nào để người ta làm cho tài liệu phụ thuộc vào DOCTYPE?
Lii

3
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


1
lỗi: javax.xml.bind.PropertyException: Tên: com.sun.xml.internal.bind.xmlHeaders giá trị: <? xml version = "1.0" encoding = "UTF-8"?>
aswzen

3

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();

2

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


1

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


1

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);  

1

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\"?>");

0

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();
  }

0

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\"?>");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.