我有一個類從第三方來源解析xml(我無法控制內容)。這裏是解組的片段:JAXB SAXParseException當解組文檔具有相對DTD的路徑
JAXBContext jContext = JAXBContext.newInstance("com.optimumlightpath.it.aspenoss.xsd");
Unmarshaller unmarshaller = jContext.createUnmarshaller() ;
StringReader xmlStr = new StringReader(str.value);
Connections conns = (Connections) unmarshaller.unmarshal(xmlStr);
Connections
是使用XJC DTD-> xsd->類生成的類。包com.optimumlightpath.it.aspenoss.xsd
包含所有這些類。
我接收的xml包含DOCTYPE中的相對路徑。以上基本上str.value
包含:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE Connections SYSTEM "./dtd/Connections.dtd">
<Connections>
...
</Connections>
它作爲java 1.5應用程序成功運行。爲了避免上述錯誤,我必須從項目根目錄下創建一個./dtd目錄,幷包含所有的dtd文件(不知道爲什麼我必須這樣做,但我們會做到這一點)。
我已經在使用上述類的Tomcat5.5上創建了一個Web服務。我在編組線上獲得[org.xml.sax.SAXParseException: Relative URI "./dtd/Connections.dtd"; can not be resolved without a document URI.]
。我曾嘗試在每個相關文件夾(項目根目錄,WebContent,WEB-INF,tomcat工作目錄等)中創建./dtd無濟於事。
問題1:我在哪裏可以找到./dtd,以便類能夠在tomcat web服務中運行時找到它?有沒有任何tomcat或服務配置我需要做的,以獲得目錄識別?
問題2:爲什麼這個類甚至首先需要dtd文件?它是否不具備需要在dtd-> xsd->類的註釋中解組的所有信息?我讀過許多關於禁用驗證,設置EntityResource和其他解決方案的文章,但是這個類並不總是作爲一個web服務部署,我不想有兩個代碼鏈。
Jorn - ty你的迴應。我首先嚐試Blaise的建議,因爲它需要最少的代碼更改。但你們都提供了非常有用的答案。我有兩種方法可以稱讚嗎? – 2010-08-30 16:18:56
我的方法可行,但Jorn方法的優點是可以保持JAXB實現不可知性,這是最便攜的解決方案。 – 2010-08-30 16:42:17