JAXP - поиск в каталоге отладки XSD

1

У меня есть ситуация, когда мы хотим проверить XML-документ, хранящийся в потоке байтов в памяти, против XSD, размещенного среди других в файловой системе. Нам бы хотелось, чтобы имя файла явно упоминалось в XML файле, но вместо этого попросите анализатор XML использовать каталог для одного или нескольких файлов XSD для проверки.

Моя попытка создать поставщика DocumentBuilder (для Guice 3.0) выглядит так:

public class ValidatingDocumentBuilderProvider implements
        Provider<DocumentBuilder> {

    static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
    static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
    static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";

    Logger log = getLogger(ValidatingDocumentBuilderProvider.class);

    DocumentBuilderFactory dbf;

    public synchronized DocumentBuilder get() { // dbf not thread-safe

        if (dbf == null) {
            log.debug("Setting up DocumentBuilderFactory");

            // http://download.oracle.com/javaee/1.4/tutorial/doc/JAXPDOM8.html
            dbf = DocumentBuilderFactory.newInstance();
            dbf.setNamespaceAware(true);
            dbf.setValidating(true);
            dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
            // parser should look for schema reference in xml file

            // Find XSD in current directory.

            FilenameFilter fileNameFilter = new FilenameFilter() {

                public boolean accept(File dir, String name) {
                    return name.toLowerCase().endsWith(".xsd");
                }
            };
            File[] schemaFiles = new File(".").listFiles(fileNameFilter);

            dbf.setAttribute(JAXP_SCHEMA_SOURCE, schemaFiles);

            log.debug("{} schema files found", schemaFiles.length);
            for (File file : schemaFiles) {
                log.debug("schema file: {}", file.getAbsolutePath());
            }

        }

        try {
            return dbf.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            throw new RuntimeException("get DocumentBuilder", e);
        }
    }
}

(и я также пробовал с именами файлов тоже). Eclipse принимает XSD - при вставке в каталог он может проверить XML, рассмотренный здесь.

Кажется невооруженным глазом, что парсер останавливается ненадолго при попытке проверить. Это может быть поиск в сети.

-Djaxp.debug=1 добавляет только эти строки

JAXP: find factoryId =javax.xml.parsers.DocumentBuilderFactory
JAXP: loaded from fallback value: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
JAXP: created new instance of class com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl using ClassLoader: null

Как я могу заставить парсер в JDK 6 рассказать мне, что он делает? Если я не могу этого сделать, как я могу проверить использование каталога XML внутри него, чтобы узнать, почему XSD не были выбраны?

Какое очевидное я пропустил?

Теги:
validation
jaxp

1 ответ

0

Вы говорите

Мы бы хотели, чтобы имя файла явно упоминалось в файле XML

Как тогда анализатор сможет выбрать соответствующую схему?

Что вы можете попробовать, это создать Schema, используя SchemaFactory, на основе всех доступных ресурсов схемы и прикрепить его к компоновщику документов factory. Затем синтаксический анализатор автоматически проверяет документ на эту "суперсхему".

Если ваш набор схем имеет внутренние зависимости (например, импорт или включение), убедитесь, что эти ссылки правильно разрешены с использованием относительных URL-адресов или специализированного распознавателя.

UPDATE:

После прочтения этого http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JAXPDOM8.html, немного более тщательно, я понимаю, что вы подходите так же, как и мое предложение, поэтому что-то еще идет n. Я могу только сказать, что то, что я описываю, работает очень хорошо.

  • 0
    Насколько я понимаю, каждый XSD упоминает, для какого пространства имен он может быть проверен. Если какое-либо из этих пространств имен используется в XML, я бы хотел, чтобы синтаксический анализатор использовал соответствующий XSD.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню