Получение информации о схеме из XML при проверке в Java - PullRequest
0 голосов
/ 22 октября 2009

Мне нужно проверить 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)?

1 Ответ

0 голосов
/ 22 октября 2009

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

  1. отредактируйте ваш XML, чтобы он содержал атрибут xsi: schemaLocation (хотя не уверен, поддерживается ли он вообще)

  2. зарегистрировать схему для вашего пространства имен:

Код:

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaFile = new StreamSource(new File(namespace + ".xsd"));
Schema schema = factory.newSchema(schemaFile);

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware( true );
dbf.setValidating(true);
dbf.setSchema(schema);
...