我已经尝试过所有提供的解决方案作为答案在这里,没有人为我的环境工作。我目前的要求是:
- jdk1.6。0_45
- JAXB注释类在每次重建时都会生成,所以 更改它们不是一个选项。
我想与您分享我的实验结果与我在stackoverflow上找到的解决方案。
定制NamespaceContextlink
简单而优雅的解决方案,但在我的环境我有以下的堆栈跟踪异常:
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)
我被困试图找出为什么这个发生异常和决定尝试别的东西。
package-info.javalink
我发现最简单的方案的修改。它通常可以工作,但是这个文件是在每次构建时生成的。这就是为什么我必须找到另一种解决方案。
架构修改link
作品所描述的,但并没有解决我的问题。我仍然在根元素中有一个名称空间。
DelegatingXMLStreamWriterlink
我也试着解决方案有提及,但我在com.sun.xml.bind.v2.runtime.output.NamespaceContextImpl(方法declareNsUri),其中我有一个奇怪的断言未能击败。
我的解决方案
虽然与断言研究的问题,我必须实现我自己的基于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);
}
}
的主要思想是,以避免将命名空间信息基础XMLStreamWriter版本XMLStreamWriter的。希望这会帮助你节省一些时间来解决类似的问题。
PS。没有必要在代码中扩展DelegatingXMLStreamWriter。我已经完成了这一步,以显示哪些方法需要改变。
其实您的实施和建议的输出不匹配。 您正在编写根标签,为什么根元素的输出中有一个名称空间。 – tkr 2010-05-12 11:34:40
啊,很好。因为我实际上使用JAXB来“硬编码”根元素。所以我做的是创建一个空的Root对象,将它编组为String,然后解析String以提取根标记。因此,如果JAXB不为根标记生成名称空间,那么我注定要失败。 – Alvin 2010-05-12 19:42:59