web-dev-qa-db-ja.com

JAXB2.0を使用してDTDフェッチを無効にする方法

JAXBを使用して、xjcを使用して最初に作成したXMLをすべてアンマッシュしようとしています。マーシャリング解除の検証は行いたくありませんが、JAXBのドキュメントに従ってu.setSchema(null);を使用して検証を無効にしましたが、これによってFileNotFoundExceptionがスローされるのを防ぐことはできません。実行しようとしてスキーマが見つからない場合。

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

Apacheプロパティを設定してSAX解析を検証から無効にするための同様の質問を見てきましたhttp://Apache.org/xml/features/validation/schemaからfalseですが、Unmarshallerに自分のsaxパーサーを使用させることができません。

22
Nick

以下は、SAXパーサーを使用するために JAXB(JSR-222) 実装を取得する方法を示すサンプルコードです。

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

}
9
bdoughan

@ 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);
    }
}
17
Renaud

Unmarshallerは、javax.xml.transform.sax.SAXSourceから直接作成できます。

このページの例を参照してください: http://docs.Oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/api/javax/xml/bind/Unmarshaller.html

あなたよりも「ただ」そのSAXSourceにあなた自身のURIResolverを提供する必要があります

0
Philip Helger