Разбор схемы в Java с импортом и включением?

Я пытаюсь разобрать загрузку довольно сложной XML-схемы в объект Schema в Java, чтобы я мог выполнить некоторую проверку XML-сообщений.

Мой код выглядит примерно так:

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new StreamSource(new File("schema/schema.xsd")));

Моя схема имеет несколько импортов:

<?xml version="1.0" encoding="UTF-8"?>
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="base_1">
  <xs:import namespace="base_1" schemaLocation="common/MessageBase.xsd"/>
</xs:schema>

...так далее. Когда я пытаюсь загрузить схему, я получаю много ошибок. Основываясь на еще одном вопросе, связанном с этим, похоже, мне нужно указать преобразователь ресурсов, но разве это не то, что должно обрабатываться по умолчанию?

Если да, есть ли конкретный каталог, в который мне нужно поместить схему относительно того, где я запускаю приложение, которое я пишу, или относительно файла базовой схемы?

Наконец, когда я загружаю схему с помощью XMLSpy или подобного, она работает нормально, и я могу без проблем проверять экземпляры XML.

3 ответа

Решение

Я думаю, что использование StreamSource без указания базового местоположения является источником вашей проблемы.

Синтаксический анализатор не может узнать, где находится основная схема, поэтому он не может разрешить общий /MessageBase.xml.

Используйте конструктор с двумя аргументами и передайте SystemID, который является путем, с которого вы начинаете.

Смотрите Javadoc для StreamSource.

Нет необходимости в распознавателе ресурсов, если вы используете URL вместо StreamSource.

URL schemaURL = Thread.currentThread().getContextClassLoader().getResource(schemaFileName);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(schemaURL);

Чтобы разрешить импортированные XSD, необходимо связать фабрику схем с распознавателем ресурсов:

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
factory.setResourceResolver(new MyResourceResolver());
Schema schema = factory.newSchema(new StreamSource(new File("schema/schema.xsd")));

Для более подробной информации вы можете посмотреть на этот ответ.

Другие вопросы по тегам