我有許多Java類與JAXB結合使用以生成XML。 java類每年的變化很小,但輸出的XML需要對其進行非常具體的年度更改,這樣做有點難以捉摸。我試過使用DOM更新屬性,但沿着樹的更多節點保持以前的狀態。我試着用反射來在編組之前直接更新註解,但它似乎沒有達到預期的效果。我也嘗試用本地類替換XMLRootElement對象(和XMLType,XMLElement),但似乎沒有任何工作正常,因爲某些信息似乎總是保留在某個地方,即使看起來我已更改成員/屬性/等。在運行時動態設置XML URI - XSLT選項
我不打算每年複製所有java對象,以便我可以更改命名空間以符合要求。
現在我正處在我認爲XSLT可能是最後一個選項的地步,但我幾乎不知道它。是否有一種簡單的方法來更新位於根元素上的5-8個名稱空間URI?我不想更改前綴(它們已經使用前綴映射器設置),我只想將名稱空間從「com.help.me.2014」更改爲「com.help.me.2015」。
感謝 安迪
分辨率:
首先,我非常感謝的努力和響應。在我回來看他們之前,我沒有嘗試其中的任何一個,因爲我想出了一個不同的解決方案。
任何未來的人都可以嘗試下面列出的項目(作爲XSLT解決方案),或者您可以嘗試下面描述的內容。
我以兩種不同的樣式/格式生成XML,一種帶有和沒有SOAP包裝。由於我在訪問DOM/SOAP對象中的實際名稱空間時遇到困難,並且無法在運行時更改註釋,所以我最終捕獲了輸出流並操作了結果字符串。
SOAP:
ByteArrayOutputStream stream = new ByteArrayOutputStream(); soapMessage.writeTo(stream); String file = new String(stream.toByteArray);
...操作文件(現在是字符串),替換值等 - >實際傳遞進行依賴注入的轉換器,然後通過發送響應到客戶端。寫
JAXB編組與SOAP非常相似,都將結果字符串發送到轉換器,並將其作爲StringBuilder操作,然後將其發送。
再次感謝您的建議。希望它能幫助未來的某個人,儘管這個要求有點不同。
安迪
這問題太廣泛了,但是對於一個設計來說,類的變化很小,但每年都會改變5-8個名稱空間。在你面臨的任何其他挑戰中,你可能會遭受糟糕設計決定的後果。 – kjhughes
這可能很簡單,只需在根上重寫URI即可。前綴只是URI處的指針。不需要額外的映射。 –
正如@kjhughes建議的那樣,它看起來像在這裏不恰當地使用命名空間。使用像_com.help.me_這樣的固定名稱空間和像'year ='2014''這樣的屬性似乎更合適。我相信這可以用XSLT來完成,但是操作這樣的命名空間是非常棘手的,因爲它們實際上並不是爲這種目的而設計的。然而,我現在唯一能想到的唯一事情是在所有舊元素的新命名空間中創建生成的元素。儘管如此,這將改變前綴。 – Matthew