Ignoring DTD when untied with EclipseLink MOXy

When I try to unmount some XML in POJO using EclipseLink MOXy, I get a FileNotFoundException where it looks for the DTD of the document as a relative path.

 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) 

I provide "external metadata" for this example , so I donโ€™t know why he even needs DTD. If I could make him ignore the DTD, or not try to resolve it, that would be great.

+4
source share
1 answer

You can disconnect from XMLStreamReader , which has DTD support disabled:

 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); } } 

Extra

If you want to write a DTD declaration, you can do the following:

  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(); 
+7
source

Source: https://habr.com/ru/post/1442043/


All Articles