Разбор схемы в Java С импортом и включением? - PullRequest
6 голосов
/ 14 ноября 2009

Я пытаюсь разобрать загрузку довольно сложной схемы 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 ]

8 голосов
/ 08 ноября 2013

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

URL schemaURL = Thread.currentThread().getContextClassLoader().getResource(schemaFileName);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(schemaURL);
8 голосов
/ 14 ноября 2009

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

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

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

См. Javadoc для StreamSource.

2 голосов
/ 21 августа 2013

Чтобы разрешить импортированные 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")));

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

...