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

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

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

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

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

ベストアンサー1

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

おすすめ記事