我有兩個版本的XSD架構。儘管XML名稱空間不同(xml名稱空間用於版本控制),但XSD非常相似。我想解析使用相同對象模型的兩個版本。 JAXB用於生成對象模型。JAXB:兩個版本的XSD,一個對象模型
是否有一種簡單的方法可以將兩個略有不同的XML模型讀入同一個對象模型?
我有兩個版本的XSD架構。儘管XML名稱空間不同(xml名稱空間用於版本控制),但XSD非常相似。我想解析使用相同對象模型的兩個版本。 JAXB用於生成對象模型。JAXB:兩個版本的XSD,一個對象模型
是否有一種簡單的方法可以將兩個略有不同的XML模型讀入同一個對象模型?
標準JAXB無法做到這一點,儘管一些實現可能有專有的解決方法。
您可以嘗試的是將文檔讀入DOM模型(即org.w3c.dom.Document),以編程方式設置DOM的名稱空間URI以匹配JAXB類模型中的名稱空間URI,然後解組DOM到JAXB(使用Unmarshaller.unmarshall(document)
這樣做的性能會吸,但是這可能無所謂你
的助手,看看this PDF描述的版本控制架構的最佳實踐(提示:。更改命名空間URI不最佳實踐...)
您可以使用帶有StAX解析器(RI,Woodstox等)的JAXB實現(Metro,MOXy,JaxMe等)來解決此問題。文檔向後兼容,您可以將您的對象模型映射到最新的模式。然後,您將欺騙您的JAXB實現,認爲文檔的所有版本都使用該名稱空間。訣竅是使用StAX API中的StreamReaderDelegate
。
對於類似的實施例
尼斯鏈接。更快的過濾方法可以基於Stax或Sax,而不是DOM。 –
@Ed:是的,是的。串起更多的努力,但可能是一個更好的解決方案。 – skaffman
這可能是SAX最簡單的一種情況,因爲添加過濾器可以很方便地轉換名稱空間聲明。 – StaxMan