Отключить проверку XML на основе внешнего DTD / XSD - PullRequest
8 голосов
/ 04 мая 2011

Есть ли способ отключить проверку XML на основе внешнего DTD / XSD без изменений в исходном коде (из библиотек, которые создают DocumentBuilder)?Что-то вроде установки параметров JVM по умолчанию для функций DocumentBuilderFactory, и то же самое для SAX?

Проверка хороша при редактировании файлов в IDE, но мне не нужно, чтобы мое веб-приложение не запускалось только потому, что somelib.net вышел из строя.

Я знаю, что могу указать локальные местоположения DTD / XSD, но это неудобный обходной путь.

Какие есть варианты?Я могу думать о двух:

1 Ответ

6 голосов
/ 23 мая 2011

Отключение проверки может не помешать процессору извлекать DTD, так как он все еще может делать это для использования значений по умолчанию атрибутов и т. Д., Присутствующих в DTD (который он будет помещать в дерево), даже если он не выполняет проверка по грамматике DTD.

Один из способов предотвращения сетевой активности при обработке XML-документа заключается в использовании «распознавателя гашения», такого как:

import java.io.ByteArrayInputStream;
import java.io.IOException;

import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class BlankingResolver implements EntityResolver
{

    public InputSource resolveEntity( String arg0, String arg1 ) throws SAXException,
            IOException
    {

        return new InputSource( new ByteArrayInputStream( "".getBytes() ) );
    }

}

, а затемустановите это перед обработкой следующим образом:

DocumentBuilderFactory factory = DocumentBuilderFactory.
factory.setNamespaceAware( true );
builder = factory.newDocumentBuilder();
builder.setEntityResolver( new BlankingResolver() );
myDoc = builder.parse( myDocUri );
// etc.

Затем вы также будете уверены, что обрабатываемый документ не был изменен какой-либо информацией из DTD.y

...