Проверить XSD-файл - PullRequest
       4

Проверить XSD-файл

3 голосов
/ 27 декабря 2011

Я хочу проверить файл XSD (не XML). Подход, который я использую, заключается в том, чтобы рассматривать XSD как любой другой файл XML и использовать этот www.w3.org / 2001 / XMLSchema.xsd в качестве схемы.

Я использую следующий код:

String schemaLang = "http://www.w3.org/2001/XMLSchema";
SchemaFactory factory = SchemaFactory.newInstance(schemaLang);
Schema schema = factory.newSchema(new StreamSource("C:\\Users\\aprasad\\Desktop\\XMLSchema.xsd"));
Validator validator = schema.newValidator();        
validator.validate(new StreamSource("shiporder.xsd"));

Но я получаю следующую ошибку:

Не удалось прочитать документ схемы 'XMLSchema.xsd', поскольку 1) не удалось найти документ; 2) документ не может быть прочитан; 3) корневой элемент документа не является <xsd:schema>.

Не уверен, что ошибка, поскольку путь к файлу правильный.

Скажите, пожалуйста, правильный подход для проверки файла XSD.

Ответы [ 3 ]

2 голосов
/ 27 декабря 2011

Вам нужно иметь два дополнительных файла прямо рядом с XMLSchema.xsd.Это:

XMLSchema.xsd ссылается на этидва файла.

Прямо рядом с , поэтому, если XMLSchema.xsd расположен в C:/XMLSchema.xsd, то вы должны иметь C:/XMLSchema.dtd и C:/datatypes.dtd.

SchemaFactory экземпляры используют (см. SchemaFactory.setResourceResolver(LSResourceResolver)) по умолчанию внутренний класс с именем XMLCatalogResolver, который реализует LSResourceResolver.Первый (я полагаю) ищет ссылочные файлы рядом с referer .

Если вы выглядите действительно настойчиво, то причина вашего SAXParseException в FileNotFoundExceptionэто говорит о том, что система не может найти файл XMLSchema.dtd.

Кроме этого, ваш код в порядке (и ваша схема тоже).

0 голосов
/ 27 декабря 2011

Интересно, чего вы пытаетесь достичь? Если factory.newSchema (X) не выдает никаких исключений, то X должен быть допустимой схемой (*). Это кажется гораздо более простым делом, чем проверка по схеме для документов схемы.

(*) обратное, конечно, не обязательно верно: X может быть допустимым для схемы для документов схемы, но недействительным по другим причинам, например, при нарушении ограничения UPA.

0 голосов
/ 27 декабря 2011

Согласно javadoc для класса StreamSource , если вы используете метод конструктора, который принимает String, эта строка должна быть действительным URI.Например, если вы пытаетесь сослаться на локальный файл, вам может потребоваться префикс пути к file:/.Кроме того, вы можете передать объект File в конструктор:

Schema schema = factory.newSchema(new File(new StreamSource("C:\\Users\\aprasad\\Desktop\\XMLSchema.xsd")));

Таким образом, в этом случае было бы полезно провести простое тестирование, чтобы исключить проблемы, вызванные тем, что ваша программа не нашла нужногофайлы, например

File schemaFile1 = new File("C:\\Users\\aprasad\\Desktop\\XMLSchema.xsd");
File schemaFile2 = new File("shiporder.xsd");
assert schemaFile1.exists();
assert schemaFile2.exists();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...