Tôi đã thử tất cả các giải pháp được cung cấp dưới dạng câu trả lời ở đây và không có giải pháp nào phù hợp với môi trường của tôi. Yêu cầu hiện tại của tôi là:
- jdk1.6.0_45
- Các lớp được chú thích JAXB được tạo khi mỗi lần tạo lại, do đó, thay đổi chúng không phải là một tùy chọn.
Tôi muốn chia sẻ với bạn kết quả thử nghiệm của tôi với các giải pháp tôi đã tìm thấy trên stackoverflow.
Tuỳ chỉnh NamespaceContextlink
đơn giản và thanh lịch giải pháp, nhưng trong môi trường của tôi, tôi có một ngoại lệ với stacktrace sau:
javax.xml.stream.XMLStreamException: Trying to write END_DOCUMENT when document has no root (ie. trying to output empty document).
at com.ctc.wstx.sw.BaseStreamWriter.throwOutputError(BaseStreamWriter.java:1473)
at com.ctc.wstx.sw.BaseStreamWriter.reportNwfStructure(BaseStreamWriter.java:1502)
at com.ctc.wstx.sw.BaseStreamWriter.finishDocument(BaseStreamWriter.java:1663)
at com.ctc.wstx.sw.BaseStreamWriter.close(BaseStreamWriter.java:288)
at MyDataConverter.marshal(MyDataConverter.java:53)
tôi đã bị mắc kẹt cố gắng tìm ra lý do tại sao ngoại lệ này xảy ra và quyết định thử cái gì khác.
Sửa đổi package-info.javalink
Giải pháp đơn giản nhất tôi đã tìm thấy. Nó thường hoạt động, nhưng tập tin này được tạo ra trên mỗi bản dựng. Đó là lý do tại sao tôi phải tìm một giải pháp khác.
Schema VỀ VIỆC SỬA ĐỔIlink
trình như mô tả nhưng không giải quyết vấn đề của tôi. Tôi vẫn có một không gian tên trong phần tử gốc.
DelegatingXMLStreamWriterlink
Tôi cũng đã cố gắng giải pháp được nêu ở đó, nhưng tôi đã có một sự khẳng định lạ trong com.sun.xml.bind.v2.runtime.output.NamespaceContextImpl (phương pháp declareNsUri) mà tôi đã thất bại trong việc đánh bại.
Giải pháp của tôi
Trong khi nghiên cứu vấn đề này với khẳng định tôi phải thực hiện phiên bản riêng của tôi về XMLStreamWriter dựa trên DelegatingXMLStreamWriter.java
public class NamespaceStrippingXMLStreamWriter extends DelegatingXMLStreamWriter {
public NamespaceStrippingXMLStreamWriter(XMLStreamWriter xmlWriter) throws XMLStreamException {
super(xmlWriter);
}
@Override
public void writeNamespace(String prefix, String uri) throws XMLStreamException {
// intentionally doing nothing
}
@Override
public void writeDefaultNamespace(String uri) throws XMLStreamException {
// intentionally doing nothing
}
@Override
public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
super.writeStartElement(null, local, null);
}
@Override
public void writeStartElement(String uri, String local) throws XMLStreamException {
super.writeStartElement(null, local);
}
@Override
public void writeEmptyElement(String uri, String local) throws XMLStreamException {
super.writeEmptyElement(null, local);
}
@Override
public void writeEmptyElement(String prefix, String local, String uri) throws XMLStreamException {
super.writeEmptyElement(null, local, null);
}
@Override
public void writeAttribute(String prefix, String uri, String local, String value) throws XMLStreamException {
super.writeAttribute(null, null, local, value);
}
@Override
public void writeAttribute(String uri, String local, String value) throws XMLStreamException {
super.writeAttribute(null, local, value);
}
}
Ý tưởng chính là để tránh chuyển thông tin không gian tên cho XMLStreamWriter cơ bản . Hy vọng điều này sẽ giúp bạn tiết kiệm thời gian giải quyết vấn đề tương tự.
PS. Nó không cần thiết để mở rộng DelegatingXMLStreamWriter trong mã của bạn. Tôi đã thực hiện điều này để cho thấy phương pháp nào cần thay đổi.
Thực tế việc triển khai và kết quả được đề xuất của bạn không khớp. Bạn đang tự viết thẻ gốc, tại sao không gian tên trong đầu ra trên phần tử gốc. – tkr
Ahh bắt tốt. Bởi vì tôi thực sự sử dụng JAXB để "mã cứng" phần tử gốc. Vì vậy, những gì tôi đã làm là tôi tạo một đối tượng Root trống, sắp xếp nó thành một String, sau đó phân tích chuỗi để trích xuất các thẻ gốc. Vì vậy, nếu JAXB không tạo ra không gian tên cho thẻ gốc thì tôi phải chịu số phận. – Alvin