[英]Ignoring DTDs when unmarshalling with EclipseLink MOXy
When trying to unmarshall some XML into a POJO using EclipseLink MOXy I'm getting a FileNotFoundException
where it's looking for the document's DTD as a relative path. 当尝试使用EclipseLink MOXy将一些XML解组为POJO时,我得到一个
FileNotFoundException
,它正在寻找文档的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)
I'm providing "externalized metadata" as per this example , so I've no idea why it even needs a DTD. 我按照这个例子提供了“外部元数据”,所以我不知道为什么它甚至需要一个DTD。 If I could get it to ignore the DTD, or not try and resolve it, that'd be great.
如果我能让它忽略DTD,或者不尝试解决它,那就太好了。
You could unmarshal from an XMLStreamReader
that has DTD support disabled: 您可以从已禁用DTD支持的
XMLStreamReader
中解组:
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 the DTD declaration you could do the following: 如果要编写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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.