2012-10-25 39 views
4

EclipseLink MOXy를 사용하여 일부 XML을 POJO에 언 마샬하려는 경우 문서의 DTD를 상대 경로로 찾고있는 FileNotFoundException이 표시됩니다.EclipseLink로 언 마샬링 할 때 DTD 무시하기

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

당신은 사용할 DTD 지원이있는 XMLStreamReader에서 비 정렬 화 수 :

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(); 
:

당신이 다음을 수행 할 수있는 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); 
    } 

} 

추가를