Разбор схемы в 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")));
Для более подробной информации вы можете посмотреть на этот ответ.