Мне нужно проверить XML-файл на соответствие XML-схеме, чтобы информация о схеме была взята из XML.
У меня есть XML-документ, который определяет его пространство имен. Как это:
<?xml version="1.0" encoding="UTF-8"?>
<myelement xmlns="mynamespace">
</myelement>
Местоположение схемы отсутствует в документе, поэтому мне нужно сообщить валидатору, где находится схема для данного пространства имен. Сейчас я делаю это следующим образом:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware( true );
DocumentBuilder parser = dbf.newDocumentBuilder();
Document document = parser.parse(new File("mydocument.xml"));
String namespace = document.getChildNodes().item(0).getNamespaceURI();
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaFile = new StreamSource(new File(namespace + ".xsd"));
Schema schema = factory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.setErrorHandler(new MyErrorHandler());
validator.validate(new DOMSource(document));
Таким образом, он работает, но у него есть две проблемы:
1) Немного неуклюже, что сначала мне приходится анализировать документ вручную и создавать схему, хотя теоретически валидатор имеет всю информацию, необходимую для его автоматического выполнения.
2) Если я проверяю объект Document, я не получаю правильные номера строк ошибок. Чтобы получить правильные номера строк, мне придется дважды проанализировать один и тот же документ (сначала для получения пространства имен, а затем для проверки).
Кто-нибудь знает лучшее решение?
Есть ли способ сообщить парсеру, что namespace1 соответствует schema1.xsd, namespace2 - schema2.xsd и т. Д. Перед анализом? Или я могу написать какой-нибудь обратный вызов, который парсер может использовать для запроса схемы (например, я могу передать LSResourceResolver в SchemaFactory)?