Использование Jing с Google App Engine. Не удается загрузить SchemaFactory из-за схемы Relax NG - PullRequest
1 голос
/ 13 февраля 2011

Хорошо, вот краткое изложение того, чего я пытаюсь достичь. Я разрабатываю небольшое приложение Google App Engine, которое генерирует XML для определенного объекта.

Теперь я сталкиваюсь с проблемами, потому что мне нужно использовать схему Relax NG и проверить ее по моему объекту Document. Это прекрасно работает на моем локальном компьютере (Eclipse Helios Java EE, Mac OS X Snow Leopard, Google Web Toolkit 2.2.0, App Engine 1.4.2), но как только я внедряюсь в App Engine, мой код завершается ошибкой и выдает исключение IllegalArgumentException .

Конкретное исключение таково:

   java.lang.IllegalArgumentException: No SchemaFactory that implements the schema language specified by: http://relaxng.org/ns/structure/1.0 could be loaded

Ниже приведены конкретные строки кода, на которые он жалуется:

  System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.CompactSyntaxSchemaFactory");
  SchemaFactory schemaFac = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI);

Последняя строка - это строка, которая выдает исключение.

Я пытался искать в Интернете и публиковать в нескольких группах Google, но никто не выдвинул идею.

Примечание: Я использовал некоторые из приведенного выше кода из этого примера: Как проверить XML-документ с использованием схемы RELAX NG и JAXP?

Я подозреваю, что App Engine по какой-то причине не загружает Jing.jar. Я не знаю, как я могу проверить, что это / не так.

Буду признателен за любую помощь! Спасибо!

Ответы [ 3 ]

3 голосов
/ 18 марта 2011

Этот пост только для уточнения.

Обычный способ проверки XML-документа с помощью Jing и Relax NG:

System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.XMLSyntaxSchemaFactory");
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI);
Schema schema = factory.newSchema(new File("path/to/schema.rng"));

Validator validator = schema.newValidator();
validator.validate(new StreamSource(new StringReader(xmlString)));

Теперь в App Engine первые две строки не работают и вызывают выброс IllegalArgumentException, как вы сказали. Так что обменивая их на

SchemaFactory factory = new XMLSyntaxSchemaFactory();

делает свое дело. Резюме (включая импорт):

import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import com.thaiopensource.relaxng.jaxp.XMLSyntaxSchemaFactory;

SchemaFactory factory = new XMLSyntaxSchemaFactory();
Schema schema = factory.newSchema(new File("path/to/schema.rng"));

Validator validator = schema.newValidator();
validator.validate(new StreamSource(new StringReader(xmlString)));

Обратите внимание, что это для схем в синтаксисе XML. Для компактного синтаксиса замените XMLSyntaxSchemaFactory на CompactSyntaxSchemaFactory.

0 голосов
/ 15 февраля 2011

Ну, я на самом деле нашел обходной путь, который полностью исключает (практически хакерское) использование System.setProperty.

Оказывается, у Jing есть небольшой класс, называемый "CompactSyntaxSchemaFactory".

Вот как я это использовал:

    DocumentBuilderFactory docFactory = null;

    CompactSyntaxSchemaFactory scReader = new CompactSyntaxSchemaFactory();
    URL relaxSchemaURL = new URL("http://example.com/myschema.rng");
    Schema2 relaxSchema = scReader.newSchema(relaxSchemaURL);

    docFactory = DocumentBuilderFactory.newInstance();
    docFactory.setSchema(relaxSchema);

Работал как шарм.

0 голосов
/ 14 февраля 2011

Я предполагаю, что System.setProperty() не работает, или, скорее, не используется правильно.Согласно документам :

Все системные свойства и переменные среды являются частными для вашего приложения.Установка системного свойства влияет только на представление этого свойства вашим приложением, а не на представление JVM.

Если SchemaFactory является частью JDK (что, я думаю, так и есть), вы не сможете сброситьЭто.Однако вам, возможно, повезет больше, установив системное свойство в файле appconfig , так как это может измениться ранее в последовательности запуска.

...