Инструмент проверки XML-схемы (XSD)? [закрыто]

266

В офисе в настоящее время мы пишем приложение, которое будет генерировать файлы XML на основе предоставленной нам схемы. У нас есть схема в файле .XSD.

Существуют ли инструменты или библиотеки, которые мы можем использовать для автоматического тестирования, чтобы убедиться, что сгенерированный XML соответствует схеме?

Мы бы предпочли бесплатные инструменты, подходящие для коммерческого использования, хотя мы не будем связывать средство проверки схемы, поэтому его нужно использовать только разработчикам во время разработки.

Наш язык разработки - C ++, если это имеет какое-то значение, хотя я не думаю, что это должно быть так, как мы могли бы сгенерировать файл XML и затем выполнить проверку, вызвав отдельную программу в тесте.

Джейсон Дагит
источник
132
Мне нравится, что многие из этих "
неконструктивных
1
Я понимаю, откуда взялись неконструктивные. Честно говоря, хотя это великий вопрос, и споры / аргументы иногда в конечном итоге превращаются в отличные ответы
Мэтт
22
это как раз тот случай, когда администраторы контрпродуктивны
anon58192932
Возможно, стоит взглянуть на подобный вопрос в контексте инструмента Maven .
Альберто
Попробуйте codverter.com/src/xmltoxsd
jonathana

Ответы:

239

После некоторого исследования, я думаю, что лучший ответ - Xerces , поскольку он реализует весь XSD, является кроссплатформенным и широко используется. Я создал небольшой проект Java на github для проверки из командной строки с использованием анализатора JRE по умолчанию, обычно это Xerces. Это может быть использовано в Windows / Mac / Linux.

Существует также версия Xerces для C ++, если вы предпочитаете ее использовать. Утилита StdInParse может быть использована для вызова из командной строки. Кроме того, комментарий ниже указывает на эту более полную утилиту обертки .

Вы также можете использовать xmllint, который является частью libxml . Возможно, вы уже установили его. Пример использования:

xmllint --noout --schema XSD_FILE XML_FILE

Одна из проблем заключается в том, что libxml не реализует всю спецификацию, поэтому вы можете столкнуться с проблемами :(

В качестве альтернативы, если вы работаете в Windows, вы можете использовать msxml , но вам понадобится какая-то оболочка для ее вызова, например GUI, описанный в этой статье DDJ . Тем не менее, кажется, что большинство людей в Windows используют XML-редактор, такой как Notepad ++ (как описано в ответе Нейта ) или XML Notepad 2007, как предложено SteveC (есть также несколько коммерческих редакторов, которые я не буду здесь упоминать).

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

ОБНОВЛЕНИЕ : я расширил это в сообщении в блоге .

Адриан Муат
источник
1
Мне было полезно следующее: jmvanel.free.fr/xsd/README.html
Мэтью Хегарти,
Может быть полезен пример использования StdinParse (в Linux): StdInParse -n -s -f -v = всегда <XML_FILE. XML_FILE должен включать расположение схемы. Для меня это дает более полные результаты, чем xmllint.
Привет
3
Есть ли способ попросить программу использовать xsi: schemaLocation вместо подачи всех XSD вручную?
Габор Гарами
@GaborGarami Не в данный момент, но это запрос на добавление: github.com/amouat/xsd-validator/issues/5
Адриан Муат
1
xmllintк сожалению, не соответствует регулярным выражениям XML, поэтому некоторые действительные регулярные выражения XML не будут проходить через него
Сергей Бушманов
112

Есть плагин для Notepad ++ под названием XML Tools, который предлагает проверку и проверку XML на XSD.

Вы можете увидеть, как использовать это здесь .

Nate
источник
5
-1, этот плагин - боль в установке
jcollum
2
Я тестировал с npp 5.8.6, XMLTools 2.3.1 unicode beta2 r805, работает нормально.
Палани
5
Отличный плагин. См. Notepad ++ XmlTools Not Install для получения справки по установке.
ladenedge
16
А с версией 5.8.7 собственный менеджер плагинов в Notepad ++ («Плагины / менеджер плагинов») делает процесс установки автоматическим.
заправлено
1
@FranzEbner У меня была такая же проблема. Например , если XMLсам XSDфайл ссылается на файл, xsi:noNamespaceSchemaLocation="file.xsd"XML Tools будет пытаться использовать его вместо того, чтобы давать вам диалог «set».
theblang
22

xmlstarlet - это инструмент командной строки, который сделает это и многое другое:

$ xmlstarlet val --help
Инструментарий XMLStarlet: проверка документов XML
Использование: xmlstarlet val <options> [<xml-file-or-uri> ...]
где <опции>
  -w или --well-form - проверить только правильность (по умолчанию)
  -d или --dtd <dtd-file> - проверить по DTD
  -s или --xsd <xsd-file> - проверить по схеме XSD
  -E или --embed - проверить с использованием встроенного DTD
  -r или --relaxng <rng-file> - проверить по схеме Relax-NG
  -e или --err - выводить подробные сообщения об ошибках в stderr
  -b или --list-bad - выводить список только тех файлов, которые не проверяются
  -g или --list-good - выводить список только тех файлов, которые проверяются
  -q или --quiet - не выводить список файлов (только возвращать код результата)

ПРИМЕЧАНИЕ. Схемы XML еще не полностью поддерживаются из-за неполной
      поддержка в libxml2 (см. http://xmlsoft.org)

XMLStarlet - это инструментарий командной строки для запроса / редактирования / проверки / преобразования
XML-документы (для получения дополнительной информации см. Http://xmlstar.sourceforge.net/)

Использование в вашем случае будет иметь вид:

xmlstarlet val --xsd your_schema.xsd your_file.xml
Чарльз Даффи
источник
3
Знаете ли вы, насколько серьезным является предупреждение о неполной поддержке XML-схем?
Джейсон Дагит
2
Судя по другим ответам, xmlstarlet немного слаб в реализации xsd.
Джейсон Дагит
3
Поскольку xmlstarlet просто использует libxml2 под капотом, вероятно, проще использовать xmllint, который поставляется вместе с libxml2 и объясняется в принятом ответе.
Адриан Муат
@JasonDagit, ... он так же слаб, как и xmllint - они используют одну и ту же реализацию библиотеки.
Чарльз Даффи
Модель контента не является детерминистской. :-(
Грег
16

Для Windows есть бесплатный XML Notepad 2007 . Вы можете выбрать XSD для проверки

ОБНОВЛЕНИЕ: еще лучше, используйте Notepad ++ с плагином XML Tools

SteveC
источник
3

Я использую Xerces:

http://xerces.apache.org/xerces-c/

Джон
источник
1
Есть ли у них командная строка, которую можно использовать из консоли для проверки валидации XSLT-файла на соответствие XSD XSLT 2.0?
Алексис Вилке
Да, вы можете установить инструмент CLI с помощью, sudo apt install libxerces-c-samplesа затем проверить документ с помощью StdInParse -v=always -n -s < document.xml.
Джгроча
2

http://www.xmlvalidation.com/

(Обязательно установите флажок «Проверять по внешней XML-схеме»)


источник
@jcollum Кажется, сейчас.
рекурсивный
2

Я просто изучаю схему. Я использую RELAX NG и использую xmllint для проверки. Я разочарован ошибками, исходящими из xmlllint. Я хотел бы, чтобы они были немного более информативными.

Если в XML указан неправильный атрибут, xmllint сообщит вам имя неподдерживаемого атрибута. Но если вам не хватает атрибута в XML, вы просто получаете сообщение о том, что элемент не может быть проверен.

Я работаю над очень сложным XML с очень сложными правилами, и я новичок в этом, поэтому отслеживание того, какой атрибут отсутствует, занимает много времени.

Обновление: я только что нашел инструмент Java, который мне очень нравится. Его можно запустить из командной строки, например xmllint, и он поддерживает RELAX NG: https://msv.dev.java.net/

Pengo
источник
2

Я нашел этот онлайн-валидатор из 'corefiling' весьма полезным -
http://www.corefiling.com/opensource/schemaValidate.html

После нескольких попыток проверить мой xsd, он дал мне подробную информацию об ошибке, поэтому я смог исправить ошибку в схеме.

inutan
источник
2

Редактор XML для быстрой и простой проверки XML доступен по адресу http://www.xml-buddy.com

Вам просто нужно запустить установщик, и после этого вы можете проверить свои XML-файлы с помощью простого в использовании настольного приложения или командной строки. Кроме того, вы также получаете поддержку Schematron и RelaxNG. Пакетная проверка также поддерживается ...

Обновление 13.01.2012: Средство командной строки является бесплатным и использует Xerces в качестве анализатора XML.

Clemens
источник
1

IntelliJ IDEA - это отличный визуальный инструмент для проверки и генерации XSD из XML, интуитивно понятный и простой.

jacktrade
источник
1

Вы можете подключить свою XML-схему к Intellisense Microsoft Visual Studio. Эта опция дает вам как проверку в реальном времени, так и автозаполнение, что просто потрясающе.

У меня есть этот точный сценарий, работающий на моей бесплатной копии Microsoft Visual C ++ 2010 Express.

AaronDanielson
источник
0

Я склонен использовать xsd от Microsoft, чтобы помочь сгенерировать xsd из файла .NET. Я также разбираю разделы xml, используя xmlstarlet. Последний бесплатный инструмент, который будет вам полезен, это altovaxml, который доступен по этому адресу: http://www.altova.com/download_components.html .

Это позволяет мне сканировать все xml-файлы, выбирая, какой xsd использовать, анализируя xml.

# Function:
#    verifyschemas - Will validate all xml files in a configuration directory against the schemas in the passed in directory
# Parameters:
#    The directory where the schema *.xsd files are located.  Must be using dos pathing like: VerifySchemas "c:\\XMLSchemas\\"
# Requirements:
#    Must be in the directory where the configuration files are located
#
verifyschemas()
{
    for FILENAME in $(find . -name '*.xml' -print0 | xargs -0)
    do
        local SchemaFile=$1$(getconfignamefromxml $FILENAME).xsd
        altovaxml /validate $FILENAME /schema $SchemaFile > ~/temp.txt 2> /dev/null
        if [ $? -ne 0 ]; then
            printf "Failed to verify: "
            cat ~/temp.txt | tail -1 | tr -d '\r'
            printf "    - $FILENAME with $SchemaFile\n"
        fi
    done
}

Для создания XML я использую: xsd DOTNET.dll / тип: CFGCLASS & переименовать schema0.xsd CFGCLASS.xsd

Чтобы получить имя xsd, я использую: xmlstarlet sel -t -m / XXX / * -v local-name () $ 1 | sed 's / $ //'

Это позволяет мне выбрать правильный XSD, используя тег элемента в файле XML.

В результате я могу вызвать функцию bash, чтобы отсканировать все файлы XML и проверить их. Даже если они находятся в нескольких подкаталогах.

Эндрю Стерн
источник