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

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

Я взял код из этого учебника и изменил строку, в которой он ищет factory, чтобы использовать XML Schema 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, но это тоже не помогло.

Приветствия:)

Ответы

Ответ 1

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

SchemaFactory.setProperty("http://saxon.sf.net/feature/xsd-version", "1.1")

Ответ 2

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

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

Вы можете выполнить одно из следующих действий.

  • Загрузите двоичные файлы Xerces2 Java 2.11.0 (XML Schema 1.1) (Beta) с сайта Xerces и вручную добавьте банки в путь к классам (или установите локально через 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
    
  • Используйте следующую неофициальную зависимость от maven.

    <dependency>
        <groupId>org.opengis.cite.xerces</groupId>
        <artifactId>xercesImpl-xsd11</artifactId>
        <version>2.12-beta-r1667115</version>
    </dependency>