Я генерирую некоторые xml-файлы, которые должны соответствовать xsd-файлу, который мне дали. Какой лучший способ проверить их соответствие?
источник
Я генерирую некоторые xml-файлы, которые должны соответствовать xsd-файлу, который мне дали. Какой лучший способ проверить их соответствие?
Библиотека времени выполнения Java поддерживает проверку. В прошлый раз, когда я проверял это, был парсер Apache Xerces под одеялом. Вы, вероятно, должны использовать javax.xml.validation.Validator .
import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import java.net.URL;
import org.xml.sax.SAXException;
//import java.io.File; // if you use File
import java.io.IOException;
...
URL schemaFile = new URL("http://host:port/filename.xsd");
// webapp example xsd:
// URL schemaFile = new URL("http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd");
// local file example:
// File schemaFile = new File("/location/to/localfile.xsd"); // etc.
Source xmlFile = new StreamSource(new File("web.xml"));
SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
Schema schema = schemaFactory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.validate(xmlFile);
System.out.println(xmlFile.getSystemId() + " is valid");
} catch (SAXException e) {
System.out.println(xmlFile.getSystemId() + " is NOT valid reason:" + e);
} catch (IOException e) {}
Константа фабрики схемы - это строка, http://www.w3.org/2001/XMLSchema
которая определяет XSD. Приведенный выше код проверяет дескриптор развертывания WAR по URL-адресу, http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
но вы также можете легко проверить его по локальному файлу.
Вы не должны использовать DOMParser для проверки документа (если ваша цель в любом случае не создать объектную модель документа). Это начнет создавать объекты DOM, когда он анализирует документ - расточительно, если вы не собираетесь их использовать.
Вот как это сделать с помощью Xerces2 . Учебник для этого, здесь (требуется регистрация).
Оригинальная атрибуция: явно скопировано отсюда :
источник
Мы строим наш проект с помощью ant, поэтому мы можем использовать задачу schemavalidate для проверки наших файлов конфигурации:
Теперь непослушные конфигурационные файлы потерпят неудачу в нашей сборке!
http://ant.apache.org/manual/Tasks/schemavalidate.html
источник
Так как это популярный вопрос, я укажу, что java может также проверять на соответствие «упомянутым» xsd, например, если сам файл .xml определяет XSD в заголовке, используя
xsi:SchemaLocation
илиxsi:noNamespaceSchemaLocation
(или xsi для определенных пространств имен) ex :или SchemaLocation (всегда список отображений пространства имен в xsd)
Здесь также работают и другие ответы, потому что файлы .xsd «сопоставляются» с пространствами имен, объявленными в файле .xml, потому что они объявляют пространство имен, и если они совпадают с пространством имен в файле .xml, то вы в порядке. Но иногда удобно иметь собственный распознаватель ...
Из javadocs: «Если вы создаете схему без указания URL, файла или источника, то язык Java создает тот, который просматривает проверяемый документ, чтобы найти схему, которую он должен использовать. Например:»
и это работает для нескольких пространств имен и т. д. Проблема с этим подходом заключается в том, что
xmlsns:xsi
, вероятно, это сетевое расположение, поэтому он по умолчанию выходит и подключается к сети с каждой проверкой, не всегда оптимальной.Вот пример, который проверяет XML-файл по любому XSD-файлу, на который он ссылается (даже если он должен извлечь их из сети):
Вы можете избежать извлечения ссылочных XSD из сети, даже несмотря на то, что xml-файлы ссылаются на URL-адреса, указав xsd вручную (см. Некоторые другие ответы здесь) или воспользовавшись распознавателем стиля «Каталог XML» . Spring, по-видимому, также может перехватывать URL-запросы для предоставления локальных файлов для проверки. Или вы можете установить свой собственный через setResourceResolver , например:
Смотрите также здесь для другого учебника.
Я считаю , что по умолчанию использовать DOM синтаксический, вы можете сделать что - то подобное с SAX парсер , который проверяющего , а также
saxReader.setEntityResolver(your_resolver_here);
источник
setResourceResolver
но помимо этого, возможно, откройте новый вопрос ...Используя Java 7, вы можете следовать документации, представленной в описании пакета .
источник
parser.parse(new File("instance.xml"))
.validator
ПринимаетSource
, так что вы можете:validator.validate(new StreamSource(new File("instance.xml")))
.ErrorHandler
если вам нужно сделать проверку.Если у вас есть Linux-машина, вы можете использовать бесплатный инструмент командной строки SAXCount. Я нашел это очень полезным.
Это проверяет против dtd и xsd. 5 с для файла 50 МБ.
В Debian Squeeze он находится в пакете "libxerces-c-samples".
Определение dtd и xsd должно быть в xml! Вы не можете настроить их отдельно.
источник
xmllint --schema phone.xsd phone.xml
(из ответа 13ren)Еще один ответ: поскольку вы сказали, что вам нужно проверять файлы, которые вы генерируете (записываете), вы можете проверить контент во время записи, вместо того, чтобы сначала писать, а затем читать обратно для проверки. Вероятно, вы можете сделать это с помощью JDK API для проверки Xml, если вы используете средство записи на основе SAX: если это так, просто создайте ссылку в валидаторе, вызвав Validator.validate (source, result), где источник исходит от вашего средства записи, а результат где выход должен идти.
В качестве альтернативы, если вы используете Stax для написания контента (или библиотеку, которая использует или может использовать stax), Woodstox также может напрямую поддерживать проверку при использовании XMLStreamWriter. Вот запись в блоге, показывающая, как это делается:
источник
Если вы генерируете XML-файлы программно, вы можете посмотреть библиотеку XMLBeans . Используя инструмент командной строки, XMLBeans автоматически генерирует и упаковывает набор объектов Java на основе XSD. Затем вы можете использовать эти объекты для создания XML-документа на основе этой схемы.
Он имеет встроенную поддержку проверки схемы и может преобразовывать объекты Java в документ XML и наоборот.
Castor и JAXB - это другие библиотеки Java, которые служат аналогично XMLBeans.
источник
С JAXB вы можете использовать код ниже:
источник
Вы ищете инструмент или библиотеку?
Что касается библиотек, то фактически стандартом де-факто является Xerces2, который имеет версии C ++ и Java .
Будьте предупреждены, хотя, это решение для тяжелого веса. Но опять же, проверка XML по файлам XSD является довольно сложной проблемой.
Что касается инструмента, который сделает это за вас, то XMLFox кажется неплохим бесплатным решением, но я не могу сказать наверняка, что не использовал его лично.
источник
Проверка по сетевым схемам
Проверка по локальным схемам
Автономная проверка XML с помощью Java
источник
Используя Woodstox , настройте анализатор StAX для проверки на соответствие вашей схеме и анализа XML.
Если обнаружены исключения, XML недействителен, в противном случае он действителен:
Примечание . Если вам нужно проверить несколько файлов, попробуйте использовать их повторно
XMLInputFactory
иXMLValidationSchema
увеличить производительность.источник
Мне пришлось проверять XML на XSD всего один раз, поэтому я попробовал XMLFox. Я нашел это очень запутанным и странным. Инструкции справки не соответствуют интерфейсу.
В итоге я использовал LiquidXML Studio 2008 (v6), который был намного проще в использовании и более знакомым (пользовательский интерфейс очень похож на Visual Basic 2008 Express, который я часто использую). Недостаток: возможность проверки отсутствует в бесплатной версии, поэтому мне пришлось использовать 30-дневную пробную версию.
источник