Как проверить XML по XSD 1.1 в Java?
Каков наилучший способ проверки XML-файлов по XML-схеме 1.1 в Java?
Я взял код из этого урока и изменил строку, где он ищет фабрику, чтобы использовать XML-схему 1.1, как я видел в этом примере кода из FAQ по 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, но это тоже не помогло.
Ура:)
5 ответов
Я не думаю, что вы можете использовать сервисный механизм JAXP для поиска процессора XSD 1.1. Загрузите Saxon или Xerces обычным способом, а затем включите обработку XSD 1.1. Для саксонцев это делается с помощью
SchemaFactory.setProperty("http://saxon.sf.net/feature/xsd-version", "1.1")
К сожалению, ни в комплектной версии JDK (начиная с Java 8), ни в последней официальной версии maven central (2.11.0) не содержится реализация XSD 1.1.
Вам действительно нужно 2.11.0-xml-schema-1.1-beta
версия Xerces для возможности запуска примера в FAQ, который вы связали.
Вы можете сделать одно из следующего.
Скачать
Xerces2 Java 2.11.0 (XML Schema 1.1) (Beta)
двоичные файлы с веб-сайта Xerces и добавление jar-файлов в classpath вручную (или установка локально через 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>
После некоторого поиска этот учебник содержит следующие зависимости, которые у меня работали:
<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>
К сожалению, эти библиотеки не являются официальными. Так что используйте это на свой страх и риск.
Существует универсальный валидатор XML, который работает с XML Schema v1.1 и использует xercesImpl-xsd11
2.12-beta-r1667115
, Валидатор доступен здесь как плагин Maven, а здесь - как встраиваемая библиотека.
Xerces-J обеспечивает «полностью совместимую реализацию XML-схемы 1.1», начиная с версии 2.12.0, текущая версия — 2.12.2, см. историю выпусков здесь: https://xerces.apache.org/news.html .