Как определить, проверяется ли XML-документ на соответствие DTD или XSD?

StackOverflow https://stackoverflow.com/questions/496369

Вопрос

В Java я могу проверить XML-документ на соответствие схеме XSD, используя javax.xml.validation.Валидатор или против DTD, просто проанализировав документ с помощью org.xml.sax.XmlReader.

Однако что мне нужно, так это способ программного определения того, проверяется ли сам документ на соответствие DTD (т.е.он содержит <!DOCTYPE ...> заявление) или XSD-файл.В идеале мне нужно сделать это без загрузки всего XML-документа в память.Кто-нибудь, пожалуйста, может помочь?

(В качестве альтернативы, если есть одинокий способ проверки XML-документа на Java, который работает как для XSD, так и для DTD - и допускает пользовательское разрешение ресурсов - это было бы еще лучше!)

Большое спасибо,

A

Это было полезно?

Решение

Не существует 100% надежного процесса определения того, как проверять произвольный XML-документ.

Например, эта версия 2.4 дескриптор развертывания веб - приложения определяет Схема W3 для проверки подлинности документа:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

Однако это столь же верный способ выразить одно и то же:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee">

РАССЛАБЬСЯ НГ похоже, у него нет механизма, который предлагал бы Любой подсказки в документе указывают на то, что вам следует его использовать.Механизмы проверки определяются потребителями документов, а не производителями.Если я не ошибаюсь, это был один из толчков, побудивших перейти от DTD к более современным механизмам проверки.

На мой взгляд, лучше всего адаптировать механизм обнаружения к набору типов документов, которые вы обрабатываете, считывая информацию заголовка и интерпретируя ее соответствующим образом.В Анализатор StAX подходит для этого - поскольку это механизм извлечения, вы можете просто прочитать начало файла, а затем прекратить синтаксический анализ первого элемента.

Ссылка на другие такие же примеры кода и еще много чего.

Другие советы

Смотрите описание пакета для javax.xml.проверка.Он содержит информацию и примеры для проверки как XSD, так и DTD

Не могли бы вы просто использовать сравнения строк?

public enum Type {
    XSD,
    DTD,
    UNKNOWN
};

public Type findType(File f) throws FileNotFoundException, IOException {
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new FileReader(f));
        String line;
        // may want to cut this loop off after a certain number of lines
        while ((line = reader.readLine()) != null) {
            line = line.toLowerCase();
            if (line.contains("<!doctype"))
                return Type.DTD;
            else if (line.contains("xsi:schemaLocation"))
                return Type.XSD;
        }
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException ex) {}
        }
    }
    return Type.UNKNOWN;
}

не могли бы вы, возможно, опубликовать пример кода того, как вы проверяете xml на соответствие заданному dtd.Это кажется простым для схемы, но я изо всех сил пытаюсь найти, как это сделать с dtd.

Большое спасибо,

Денис.

Хорошо, я нашел это:

    XMLReader reader = XMLReaderFactory.createXMLReader();

    // try to activate validation
    try {
          // Turn on validation
          reader.setFeature("http://xml.org/sax/features/validation", true);
          // Ensure namespace processing is on (the default)
          reader.setFeature("http://xml.org/sax/features/namespaces", true);
    } catch (SAXException e) {
        System.err.println("Cannot activate validation.");
    }

    try {
        reader.parse("testFiasRequest.xml");
    } catch (IOException e) {
        System.err.println("I/O exception reading XML document");
    } catch (SAXException e) {
        System.err.println("XML exception reading document.");
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top