Как отключить выборку DTD с помощью JAXB2.0 - PullRequest
21 голосов
/ 28 марта 2012

Я пытаюсь использовать JAXB, чтобы разобрать некоторые XML, которые я использовал для создания xjc.Я не хочу выполнять какую-либо проверку для демаршаллинга, но даже если я отключил проверку в соответствии с документацией JAXB с u.setSchema(null);, но это не помешало выбросить FileNotFoundException, когда он пытается работать и можетне могу найти схему.

JAXBContext jc = JAXBContext.newInstance("blast");
Unmarshaller u = jc.createUnmarshaller();
u.setSchema(null);
return u.unmarshal(blast)

Я видел похожие вопросы по отключению синтаксического анализа SAX от проверки, установив для свойства apache http://apache.org/xml/features/validation/schema значение false, но я не могу заставить Unmarshaller использовать мой собственный синтаксический анализатор саксофона.

Ответы [ 4 ]

17 голосов
/ 03 февраля 2014

Основываясь на ответах @ blaise-doughan и @aerobiotic, вот решение, которое сработало для меня:

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);
    }
}
8 голосов
/ 28 марта 2012

Ниже приведен пример кода, демонстрирующий, как получить реализацию JAXB (JSR-222) для использования вашего синтаксического анализатора 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());
    }

}
0 голосов
/ 24 июля 2013

Проверьте этот ресурс https://java.net/projects/jaxb/lists/users/archive/2003-11/message/60 Это сработало для меня, когда лучший ответ не сработал.

0 голосов
/ 28 марта 2012

Вы можете создать Unmarshaller напрямую из javax.xml.transform.sax.SAXSource.

См. Пример на этой странице: http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/api/javax/xml/bind/Unmarshaller.html

Чем вам «нужно» предоставить свой собственный URIResolver для этого SAXSource

...