java - Cómo deshabilitar la recuperación de DTD utilizando JAXB2.0
validation (4)
A continuación se muestra un código de ejemplo que muestra cómo obtener una implementación JAXB (JSR-222) para usar su analizador SAX:
import java.io.FileReader;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.sax.SAXSource;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foo.class);
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
XMLReader xmlReader = spf.newSAXParser().getXMLReader();
InputSource inputSource = new InputSource(new FileReader("input.xml"));
SAXSource source = new SAXSource(xmlReader, inputSource);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Foo foo = (Foo) unmarshaller.unmarshal(source);
System.out.println(foo.getValue());
}
}
Estoy tratando de usar JAXB para desempaquetar algunos XML que usé xjc para crear en primer lugar. No quiero hacer ninguna validación en el desmedido, pero a pesar de que he deshabilitado la validación de acuerdo con la documentación de JAXB con u.setSchema(null);
, pero esto no ha evitado que se FileNotFoundException
una FileNotFoundException
cuando intenta ejecutarse y no puede encontrar el esquema.
JAXBContext jc = JAXBContext.newInstance("blast");
Unmarshaller u = jc.createUnmarshaller();
u.setSchema(null);
return u.unmarshal(blast)
He visto preguntas similares para deshabilitar el análisis de SAX de la validación configurando la propiedad apache http://apache.org/xml/features/validation/schema
en false
, pero no puedo hacer que el Unmarshaller use mi propio analizador sax.
Echa un vistazo a este recurso https://java.net/projects/jaxb/lists/users/archive/2003-11/message/60 Funcionó para mí cuando la mejor respuesta no funcionó.
Puede crear el Unmarshaller directamente desde un javax.xml.transform.sax.SAXSource.
Vea el ejemplo en esta página: http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/api/javax/xml/bind/Unmarshaller.html
De lo que "solo" necesita proporcionar su propio URIResolver a ese SAXSource
Sobre la base de las respuestas de @ blaise-doughan y @aerobiotic, aquí hay una solución que funcionó para mí:
import java.io.FileReader;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.sax.SAXSource;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
public class Demo2 {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(MyBean.class);
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
spf.setFeature("http://xml.org/sax/features/validation", false);
XMLReader xmlReader = spf.newSAXParser().getXMLReader();
InputSource inputSource = new InputSource(
new FileReader("myfile.xml"));
SAXSource source = new SAXSource(xmlReader, inputSource);
Unmarshaller unmarshaller = jc.createUnmarshaller();
MyBean foo = (MyBean) unmarshaller.unmarshal(source);
}
}