Как проверить против схемы в JAXB 2.0 без маршалинга?

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

Clojure cheatsheet рекомендует some или filter для поиска seq.

  • приблизительно [1 115]
(defn lookup
  [x col]
  (some (fn [[k v]]
          (when (= x k) v))
        col))
  • фильтр
(defn lookup
  [x col]
  (->> col
       (filter (fn [[k v]]
                 (when (= x k) v)))
       first))

  • понимание списка

Также хороший вариант. См. ответ amalloy .

  • универсальное решение, если Вы хотите стать сумасшедшими

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

(defn lookup
  [pred f col]
  (some (fn [x]
          (when (pred x)
            (f x)))
       col))

(defn lookup
  [pred f col]
  (first (for [x col :when (pred x)]
           (f x))))

;; usage: (lookup (comp '#{b} first) second data)

48
задан skaffman 14 October 2009 в 07:36
поделиться

1 ответ

Во-первых, javax.xml.bind.Validator устарел в пользу javax.xml.validation.Schema ( javadoc ). Идея заключается в том, что вы анализируете свою схему с помощью javax.xml.validation.SchemaFactory ( javadoc ) и вводите это в маршаллер / демаршаллер.

Что касается вашего вопроса относительно проверка без маршалинга, проблема здесь в том, что JAXB фактически делегирует проверку Xerces (или любому другому процессору SAX, который вы используете), а Xerces проверяет ваш документ как поток событий SAX. Итак, для проверки вам необходимо выполнить некоторый вид маршаллинга.

Самая низкая реализация этого будет использовать реализацию «/ dev / null» процессора SAX. Маршалинг до нулевого OutputStream по-прежнему будет включать создание XML, что является расточительным. Поэтому я предлагаю:

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(locationOfMySchema); 

Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setSchema(schema);
marshaller.marshal(objectToMarshal, new DefaultHandler());

DefaultHandler отбросит все события, а операция marshal () вызовет исключение JAXBException, если проверка схемы не удалась.

73
ответ дан 26 November 2019 в 18:48
поделиться
Другие вопросы по тегам:

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