Как проверить XML-документ с помощью ОСЛАБЛЕНИЯ схемы NG и JAXP?

там какой-либо лучший путь, чем просто цикличное выполнение через и вручную сравнение этих двух полей для каждого объекта и затем повреждения при нахождении? Это просто кажется настолько грязным, ища лучший путь.

, Если Ваше беспокойство является пригодностью для обслуживания, Вы могли бы сделать то, что Fabian Steeg предлагает (это - то, что я сделал бы), хотя это, вероятно, не является "самым эффективным" (потому что необходимо отсортировать массив сначала и затем выполнить двоичный поиск), но конечно самый чистый и более оптимальный вариант.

, Если Вы действительно обеспокоены эффективностью, можно создать пользовательскую Реализацию списка, которая использует поле в объекте как хеш, и используйте HashMap в качестве устройства хранения данных. Но вероятно это было бы слишком много.

Затем необходимо изменить место, где Вы заполняете данные от ArrayList до YourCustomList.

Как:

 List list = new ArrayList();

 fillFromSoap( list );

К:

 List list = new MyCustomSpecialList();

 fillFromSoap( list );

реализация была бы чем-то как следующее:

class MyCustomSpecialList extends AbstractList  { 
    private Map internalMap;

    public boolean add( YourObject o ) { 
         internalMap.put( o.getThatFieldYouKnow(), o );
    }

    public boolean contains( YourObject o ) { 
        return internalMap.containsKey( o.getThatFieldYouKnow() );
    }

}

В значительной степени как HashSet, проблемой здесь является HashSet, полагается на хорошую реализацию метода хэш-кода, который, вероятно, Вы не имеете. Вместо этого Вы используете в качестве хеша, "которому поле, которое Вы знаете", который является тем, который делает один объект, равняется другому.

, Конечно, реализация Списка от партии царапины, более хитрой, чем мой отрывок выше, вот почему, я говорю Fabian Steeg , предложение было бы лучше и легче реализовать (хотя что-то вроде этого будет более эффективным)

, Говорят нам, что Вы сделали в конце.

15
задан Avi Flax 16 October 2009 в 14:34
поделиться

5 ответов

См. Блог Стефана Бодвига, написанный 7 марта 2008 г. и озаглавленный RELAX NG Validation in XMLUnit :

С прошлой ночи ствол XMLUnit содержит новый класс Validator, основанный на javax.xml.validation, который является частью JAXP 1.3 (т.е. Java5 +).

...

Насколько мне известно, там не является реализацией JAXP, которая поддерживает RELAX NG из коробки. Собственный JAXP 1.4 (Java6 +) Sun, конечно же, этого не делает. Некоторый поиск привел меня к блогу Kohsuke Kawaguchi , который должен знать, учитывая его работу над JAXP, Sun's Multi Schema Validator, isorelax и другими вещами.

Использование его isorelax-bridge и Jing ни к чему не привело на Java6. Я вернулся к статье Косуке Кавагути и прочитал комментарии: мост не работает с Java6, так как они изменили алгоритм поиска SchemaFactory. Хорошо, вместо этого попробовал Java5 - прогресс, теперь я получаю исключение NullPointerException где-то внутри Jing, так что, по крайней мере, он загружает фабрику. Затем я заменил Jing на MSV (который сейчас здесь , независимо от того, сколько ссылок ведет вас на страницу стека WebServices в Sun, так что «хорошие URL-адреса никогда не меняются») и действительно, мой упрощенный тесты пройдены.

Так что вам, возможно, придется перепрыгнуть через некоторые препятствия, чтобы получить поддержку RELAX NG в вашей настройке JAXP - в моем случае Java5, MSV и мост Кавагути работали, но в комментариях указано, что это должно быть выполнено и с Java6, но как только вам удастся все правильно настроить, XMLUnit теперь будет там, чтобы вы могли подтвердить достоверность вашего документа в модульных тестах. Однако похоже, что это не работает для компактного синтаксиса.

Чтобы прочитать комментарии в блоге Kohsuke Kawaguchi, вы должны использовать archive.org , потому что почему-то все они исчезли:

Java 5 интерпретирует поставщика услуг файл как список пар ключ / значение, что является нарушением Java 5 и 6 Спецификация файла JAR, но бывает соответствуют вашему примеру.

Java 6 анализирует поставщика услуг файл, как указано, т.е. как список полностью определенные имена классов, но таким образом не может создать экземпляр вашего адаптера SchemaFactory как поставщик услуг содержимое файла недействительно.

Для совместимости с Java 5 и Java 6 без изменения JAXP-JARV-адаптер JAR файл, можно просто добавьте еще один файл JAR, содержащий правильный javax.xml.validation.SchemaFactory Файл поставщика услуг.

9
ответ дан 1 December 2019 в 03:14
поделиться

... IllegalArgumentException, как только он пытается создать экземпляр фабрики.

Означает, что язык схемы не распознается, возможно, несколько причин.

  • Поскольку Sun JDK не включает валидатор RELAX NG по умолчанию, возможно, он не найден.
  • Возможно, вы сделали ошибку в идентификаторе языка схемы.
0
ответ дан 1 December 2019 в 03:14
поделиться

Я не могу помочь вам с API проверки JAXP, но Nux предоставляет класс, который может проверять практически все типы схем, известных человеку. Что касается схем RELAX NG, используйте этот заводской метод для создания соответствующего объекта валидатора.

1
ответ дан 1 December 2019 в 03:14
поделиться

Другой вариант - Trang , переводчик RelaxNG в XMLSchema. Я считаю, что он предназначен для использования в качестве инструмента сборки, а не библиотеки времени выполнения, но лучшим вариантом может быть преобразование вашей схемы в XMLSchema с использованием Trang во время сборки, а затем проверка на это вместо этого. Таким образом, вы можете точно увидеть, как выглядит перевод, и в то же время в полной мере использовать поддержку схемы XML в JAXP.

1
ответ дан 1 December 2019 в 03:14
поделиться

Я решил эту очень ошибку на Java 1.6 со следующей строкой:

// Specify you want a factory for RELAX NG "compact"
System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.CompactSyntaxSchemaFactory");

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI);

Это позволяет мне использовать jing для проверки XML-документа против компактного расслабления схемы NG. Полный пример ниже. Я не использовал мост или что-нибудь еще. Время выполнения имеет только Jing.jar (20091111) и мой собственный класс валидатора.

import java.io.File;
import java.io.IOException;

import javax.xml.XMLConstants;
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 Validate
{

    public static void main(String[] args) throws SAXException, IOException
    {
        // Specify you want a factory for RELAX NG
        System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.CompactSyntaxSchemaFactory");
        SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI);

        // Load the specific schema you want.
        // Here I load it from a java.io.File, but we could also use a
        // java.net.URL or a javax.xml.transform.Source
        File schemaLocation = new File(args[0]);

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

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

        for (int i = 1; i < args.length; i++)
        {
            String file = args[i];

            // Check the document
            try
            {
                validator.validate(new StreamSource(new File(file)));
                System.out.println(file + " is valid.");
            }
            catch (SAXException ex)
            {
                System.out.print(file + " is not valid because: " + ex.getMessage());
            }
        }
    }

}

Еще раз, я только проверил этот ион Java 1.6.

$ java -version
java version "1.6.0_01"
Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode, sharing)
12
ответ дан 1 December 2019 в 03:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: