Как определить, проверяется ли XML-документ на соответствие DTD или XSD?
-
20-08-2019 - |
Вопрос
В 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.");
}