2012-03-24 61 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