2012-10-25 66 views
4

當試圖使用EclipseLink MOXy將某些XML解組爲POJO時,我得到一個FileNotFoundException,它將查找文檔的DTD作爲相對路徑。在使用EclipseLink解組時忽略DTD MOXy

Exception in thread "main" org.springframework.oxm.UnmarshallingFailureException: JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException 
- with linked exception: 
[java.io.FileNotFoundException: C:\Users\deejay\Documents\workspace-sts-3.0.0.RELEASE\moxy-test\ieee_idams_exchange.dtd (The system cannot find the file specified)] 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.convertJaxbException(Jaxb2Marshaller.java:761) 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:682) 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:665) 
    at com.mendeley.services.utility.EclipseLinkMarshaller.load(EclipseLinkMarshaller.java:29) 
    at com.mendeley.MoxyTest.main(MoxyTest.java:31) 

我提供「外部化元數據」按this example,所以我不知道爲什麼它甚至需要一個DTD。如果我能夠忽略DTD,或者不嘗試解決它,那會很棒。

回答

7

你可以從你的XMLStreamReader有DTD支持禁用解組:

import javax.xml.bind.*; 
import javax.xml.stream.*; 
import javax.xml.transform.stream.StreamSource; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Customer.class); 

     XMLInputFactory xif = XMLInputFactory.newFactory(); 
     xif.setProperty(XMLInputFactory.SUPPORT_DTD, false); 
     XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource("input.xml")); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     Customer customer = (Customer) unmarshaller.unmarshal(xsr); 
    } 

} 

額外

如果你想寫DTD的聲明,你可以做到以下幾點:

XMLOutputFactory xof = XMLOutputFactory.newFactory(); 
    XMLStreamWriter xsw = xof.createXMLStreamWriter(System.out); 
    xsw.writeDTD("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">"); 

    Marshaller marshaller = jc.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); 
    marshaller.marshal(html, xsw); 
    xsw.close(); 
相關問題