2012-03-24 84 views
3

我有一种情况,我需要为我的jaxb类动态地设置我的名称空间。我的jaxb类中的命名空间有一个需要动态更改的版本。在jaxb编组中动态设置对象的名称空间

@XmlRootElement(name = "myobject",namespace="http://myhost.com/version-2") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType 
public class myObject{ 

} 

我编组完美的作品时,我用这种静态的命名空间的机制,但在我的真实情况,我需要这个版本的动态改变..

我试过这个方法来解决这个问题编组

XMLStreamWriter xmlStreamWriter =  
XMLOutputFactory.newInstance().createXMLStreamWriter(stringWriter); 
String uri = "http://myhost.com/ver-"+version; 

//xmlStreamWriter.setDefaultNamespace(uri); 
xmlStreamWriter.writeStartDocument("1.0"); 

xmlStreamWriter.writeNamespace("ns1", uri); 

我尝试使用setDefaultNamespace的并不成功,和writeNamespace扔我一个错误 无效状态:起始标记不是在和writeNamespace

打开

关于如何解决这个问题的任何意见都非常感谢。

+0

看一看http://stackoverflow.com/questions/277502/jaxb-how- to-ignore-namespace-during-unmarshalling-xml-document有几个例子说明如何在运行中处理有效载荷。 – Osw 2012-03-25 06:16:25

回答

2

您可以实现XMLStreamWriter委托给原作者所有呼叫,但覆盖writeNamespace(...)方法:

public void writeNamespace(String prefix, String uri) { 
    if ("http://myhost.com/version-2".equals(uri) { 
    uri = "http://myhost.com/version-" + version; 
    } 
    delegate.writeNamespace(prefix, uri); 
} 
+0

当我尝试覆盖此.. xmlStreamWriter.writeNamespace(“ns2”,http://myhost.com /版本-2); 我得到这个错误.. 无效状态:起始标记不是在 和writeNamespace(NS2,http://myhost.com/version-2)打开 – Sanath 2012-03-25 22:11:02

+0

请尽量覆盖的startElement(字符串URI,... )和setPrefix(...)metods以相同的方式。基本上,获取namespaceURI参数的每个方法都需要进行名称空间转换。 – chris 2012-03-26 18:31:24

+0

因为我只想在xml的根元素中添加名称空间版本,所以我做了这个诀窍。我有这样的xml注释模型类@XmlRootElement(name =“myobject”,namespace =“myhost.com/version-“)@XmlAccessorType(XmlAccessType.FIELD)@XmlType public class myObject {} – Sanath 2012-04-09 04:51:39

1

您是否考虑过使用XSL-T转换?根据你的模式,在编组之后替换命名空间可能会相对简单。

+0

这样的表现怎么样..我觉得在编组之后再读dom树的表现会影响表现。为什么我不能在创建xml流编写器时使用默认命名空间或类似的东西? – Sanath 2012-03-25 04:33:57

+1

我想我记得存在流式XSL处理器。它们的功能有限,但对于这样简单的任务应该没问题。 – Jarekczek 2017-06-02 13:01:54