Проверка XML-файла с использованием RELAX NG Schema в Java (IDE - Eclipse)
Я пытался проверить имя файла xml bookNew.xml по сравнению с файлом.rnc с именем bookNewRelax.rnc.
Ошибка, с которой я постоянно сталкиваюсь -
Исключение в потоке "main" java.lang.IllegalArgumentException: Нет SchemaFactory, который реализует язык схемы, указанный в: http://relaxng.org/ns/structure/1.0 не может быть загружен в javax.xml.validation.SchemaFactory.newInstance(неизвестно Источник) на testRelax.main(testRelax.java:38)
Чтобы предотвратить это, я использовал строку кода перед созданием объекта класса SchemaFactory, который, как я полагал, поможет решить эту проблему. часть кода выглядит так:
System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.CompactSyntaxSchemaFactory");
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI);
Я включил в свой проект внешний файл jar - jing.jar, и все же создается то же исключение.
Я также импортировал библиотеку com.thaiopensource.*; и это подчеркнуто желтым, показывая, что это никогда не используется вообще. Лично я думаю, что здесь находится файл jar, в котором воспроизводится спойлспорт, иначе почему бы никогда не использовать библиотеку thaiopensource.
Я вставляю файл Java внизу.
импорт java.io.*; import java.lang.management.ManagementFactory; импорт java.lang.management.ThreadMXBean;
import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.dom.DOMSource; импорт javax.xml.validation. *;
import org.w3c.dom.Document; import org.xml.sax.SAXException;
импорт com.thaiopensource.*;
открытый класс testRelax {
/** Get CPU time in nanoseconds. */
public static long getCpuTime( ) {
ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
return bean.isCurrentThreadCpuTimeSupported( ) ?
bean.getCurrentThreadCpuTime( ) : 0L;
}
/** Get user time in nanoseconds. */
public static long getUserTime( ) {
ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
return bean.isCurrentThreadCpuTimeSupported( ) ?
bean.getCurrentThreadUserTime( ) : 0L;
}
public static void main(String args[]) throws SAXException, IOException, ParserConfigurationException {
System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.CompactSyntaxSchemaFactory");
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI);
File schemaLocation = new File("C:/Users/gp85943/workspace/TestBookRelax/src/bookNewRelax.rnc");
Schema schema = factory.newSchema(schemaLocation);
Validator validator = schema.newValidator();
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
File file=new File("C:/Users/gp85943/workspace/TestBookRelax/src/bookNew.xml");
try{
long startTime = System.currentTimeMillis();
System.out.println("Milli"+startTime);
long startUserTimeNano = getUserTime( );
System.out.println("Nano"+startUserTimeNano);
long startCPUTimeNano = getCpuTime( );
System.out.println("Nano"+startCPUTimeNano);
Document doc = builder.parse(new File("C:/Users/gp85943/workspace/TestBookRelax/src/bookNew.xml"));
DOMSource source = new DOMSource(doc);
validator.validate(source);
long stopTime = System.currentTimeMillis();
System.out.println("MilliStop"+stopTime);
long elapsedTime = stopTime - startTime;
System.out.println("Elapsed time"+elapsedTime);
//System.out.println("getUserTime--->"+getUserTime());
//System.out.println("getCpuTime--->"+getCpuTime());
//System.out.println("startUserTimeNano--->"+startUserTimeNano);
//System.out.println("startCPUTimeNano--->"+startCPUTimeNano);
long taskUserTimeNano = getUserTime( ) - startUserTimeNano;
System.out.println("User"+taskUserTimeNano);
long taskCpuTimeNano = getCpuTime( ) - startCPUTimeNano;
System.out.println("CPU"+taskCpuTimeNano);
System.out.println(file + " The document is valid");
}
catch(SAXException ex)
{
System.out.println("the document is not valid because--");
System.out.println(ex.getMessage());
}
}
}
Пожалуйста, посоветуйте мне, как сделать так, чтобы моя java-программа "принимала" RELAX NG Compact Schema (или просто подойдет.rng), чтобы сделать правильную проверку. Спасибо в ожидании.
2 ответа
Реализации Java не требуются для реализации валидации RELAX NG через SchemaFactory. Таким образом, даже если он работает в одной среде, он не является переносимым. Из вашего сообщения об ошибке видно, что ваша конкретная реализация Java не поддерживает его.
Поскольку у вас есть библиотеки Jing, вы можете проверить их использование - для начала ознакомьтесь с документацией здесь.
У меня была та же проблема, и оказалось, что мне не хватает jing-20091111.jar из пути к классам.
Я использовал некоторые механизмы загрузчика классов, поэтому все классы jing были доступны, если я использовал их в своем коде. Проблема заключалась в том, что SchemaFactory не знала о моих загрузчиках классов, поэтому мне пришлось поместить банку прямо в путь к классам.
Поэтому я считаю, что ответ alexbrn о поддержке отдельных реализаций Java неверен. Когда System.setProperty() используется для обеспечения реализации для RELAX NG, он должен работать в каждой JVM.