Как проверить XML на XSD 1.1 в Java?

Каков наилучший способ проверки XML-файлов по XML-схеме 1.1 в Java?

Я взял код из этого учебника и изменил строку где он ищет фабрику для использования схемы XML 1.1, как я видел в этом примере кода из Часто задаваемые вопросы по Xerces.

Это мой код:

import java.io.File;
import java.io.IOException;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.xml.sax.SAXException;

public class XSDValidator {
    private static void validateFile(File xmlFile, File xsdFile) throws SAXException, IOException
    {
        // 1. Lookup a factory for the W3C XML Schema language
        SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/XML/XMLSchema/v1.1");
        // SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

        // 2. Compile the schema.
        File schemaLocation = xsdFile;
        Schema schema = factory.newSchema(schemaLocation);

        // 3. Get a validator from the schema.
        Validator validator = schema.newValidator();

        // 4. Parse the document you want to check.
        Source source = new StreamSource(xmlFile);

        // 5. Check the document
        try
        {
            validator.validate(source);
            System.out.println(xmlFile.getName() + " is valid.");
        }
        catch (SAXException ex)
        {
            System.out.println(xmlFile.getName() + " is not valid because ");
            System.out.println(ex.getMessage());
        }
    }
}

Код выдает это исключение:

java.lang.IllegalArgumentException: No SchemaFactory that implements the schema language specified by: http://www.w3.org/XML/XMLSchema/v1.1 could be loaded

Как я вижу, у меня есть точно такой же импорт, как фрагмент кода в FAQ по Xerces. Я даже пытался добавить Xerces к моим зависимостям Maven, но это тоже не помогло.

Ваше здоровье :)


person Vogon Jeltz    schedule 27.12.2013    source источник
comment
Откуда взялся "http://www.w3.org/XML/XMLSchema/v1.1"?   -  person PM 77-1    schedule 28.12.2013
comment
@PM77-1 w3.org/TR/xmlschema11-1/#langids   -  person vandale    schedule 28.12.2013
comment
Похоже, что javax.xml использует W3C_XML_SCHEMA_NS_URI для этой цели.   -  person PM 77-1    schedule 28.12.2013
comment
Если я использую это, это схема 1.0.   -  person Vogon Jeltz    schedule 28.12.2013


Ответы (4)


Я не думаю, что вы можете использовать механизм службы JAXP для поиска процессора XSD 1.1. Загрузите Saxon или Xerces обычным способом, а затем включите обработку XSD 1.1. Для Saxon это делается с помощью

SchemaFactory.setProperty("http://saxon.sf.net/feature/xsd-version", "1.1")
person Michael Kay    schedule 28.12.2013
comment
Я имел в виду использование SchemaFactory.newInstance() после помещения Xerces или Saxon в путь к классам и/или установки соответствующего системного свойства, чтобы определить, какой процессор вы хотите загрузить. - person Michael Kay; 29.12.2013
comment
Это не работает, я установил класс обоих jar. - person Lavekush Agrawal; 28.04.2014
comment
Затем задайте новый вопрос и скажите, что именно вы сделали и почему это не удалось. Мы не можем помочь вам на основании одного неграмотного предложения. - person Michael Kay; 28.04.2014
comment
У меня не работает. Какая минимальная версия Java/Saxon мне нужна? Документ test.xml был проанализирован неправильно: свойство 'saxon.sf.net/feature/xsd- версия' не распознается. Свойство «saxon.sf.net/feature/xsd-version' не распознано. Трассировки стека: ..... - person Alex; 11.03.2016
comment
Было бы неплохо иметь полный код. Я не знаю, как нормально загрузить Saxon или Xerces, и мне нужно гуглить, чтобы выяснить, как установить соответствующие системные свойства. - person Alex; 11.03.2016
comment
@MichaelKay: для Saxon лучше использовать константу из FeatureKeys для установки свойств: SchemaFactory.setProperty(FeatureKeys.XSD_VERSION, "1.1"); - person the hand of NOD; 29.04.2019
comment
@MichaelKay: К сожалению, я получаю следующее исключение при попытке установить свойство: Caused by: org.xml.sax.SAXNotRecognizedException: Property 'http://saxon.sf.net/feature/xsd-version' is not recognized.. - person the hand of NOD; 30.04.2019
comment
Пожалуйста, поднимите новый вопрос и объясните, что именно вы делаете и почему это не удается. - person Michael Kay; 30.04.2019

К сожалению, ни пакетная версия JDK (начиная с Java 8), ни последняя официальная версия от maven Central (2.11.0) не содержат реализацию XSD 1.1.

На самом деле вам нужна 2.11.0-xml-schema-1.1-beta версия Xerces, чтобы запустить пример из часто задаваемых вопросов, на которые вы ссылаетесь.

Вы можете сделать одно из следующего.

  1. Загрузите двоичные файлы Xerces2 Java 2.11.0 (XML Schema 1.1) (Beta) с веб-сайта Xerces и вручную добавьте jar-файлы в путь к классам (или установите локально через Maven). Ссылка: http://xerces.apache.org/mirrors.cgi. Вам нужно как минимум следующее:

    cupv10k-runtime.jar
    org.eclipse.wst.xml.xpath2.processor_1.1.0.jar
    xercesImpl.jar
    xml-apis.jar
    
  2. Используйте следующую неофициальную зависимость maven.

    <dependency>
        <groupId>org.opengis.cite.xerces</groupId>
        <artifactId>xercesImpl-xsd11</artifactId>
        <version>2.12-beta-r1667115</version>
    </dependency>
    
person Mustafa    schedule 08.08.2015
comment
Большое спасибо, наконец-то это кажется правильным .jar. Вокруг SO есть комментарии, в которых говорится, что xercesImpl/2.11.0 можно использовать для проверки xsd1.1, но, похоже, это не так. - person Alex; 14.03.2016
comment
Вот как это сделать. Также с выпуском 2.12.0. Кроме того, мне пришлось установить функцию cta-full-xpath-checking в schemafactory: SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/XML/XMLSchema/v1.1"); schemaFactory.setFeature("http://apache.org/xml/features/validation/cta-full-xpath-checking",true); return schemaFactory; - person the hand of NOD; 30.04.2019

Существует универсальный валидатор XML, который работает с XML-схемой версии 1.1 и использует xercesImpl-xsd11 2.12-beta-r1667115. Валидатор доступен здесь в виде подключаемого модуля Maven, и здесь как встраиваемая библиотека.

person Seva Safris    schedule 25.04.2018
comment
Обе ссылки не работают и ведут на сайт 404 not found. - person the hand of NOD; 30.04.2019
comment
@thehandofNOD, извините за битые ссылки. Я обновил свой пост. Артефакты для этого валидатора будут выпущены в Maven Central на следующей неделе (неделя 2019-05-06). - person Seva Safris; 01.05.2019

После некоторого поиска это руководство содержит эту зависимость, которая работала для меня:

<dependency>
    <groupId>org.exist-db.thirdparty.xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.12.0</version>
    <classifier>xml-schema-1.1</classifier>
</dependency>

<!-- xpath2 and java-cup are needed at runtime
        for xercesImpl Schema 1.1 support -->
<dependency>
    <groupId>org.exist-db.thirdparty.org.eclipse.wst.xml</groupId>
    <artifactId>xpath2</artifactId>
    <version>1.2.0</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>edu.princeton.cup</groupId>
    <artifactId>java-cup</artifactId>
    <version>10k</version>
    <scope>runtime</scope>
</dependency>

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

person Diego    schedule 27.10.2020