Средство проверки XML в командной строке для Windows
Я всегда считал валидацию против схемы неоценимой опекой против thinkos и хотел бы включить проверки проверки как часть проекта, где мне часто приходится вручную записывать XML файлы длиной в несколько сотен строк. У моего текстового редактора есть довольно приятная функция интеграции с CLI, поэтому я ищу валидатор командной строки.
Когда я не нашел никаких явных победителей через Google, я ткнул сюда и нашел аналогичный вопрос, но ни один из предложенных там инструментов не соответствовал моим потребностям
- libxml (через cygwin) - не сообщает номера строк; Я не знаю, где мои ошибки!
- msxml - невозможно запустить из командной строки?
- xerces-c - требуется копия Visual C?
- xerces2-j - невозможно запустить из командной строки?
- xmlstarlet - недостаточная поддержка XSD *
(* Схема, которую я проверяю против групп подстановок использования, - неадекватно, но она внешняя по отношению к проекту, поэтому я не могу ее изменить, что приводит к тому, что xmlstarlet
задыхается даже в действительных файлах.)
Обычно это решение проблемы, при которой я бы отказался от поиска существующего решения и дошел до Python-hammer, но поддержка Python XML известна... ну... на самом деле, позвольте просто оставить ее на "пресловутый".
Итак, я вернусь к поиску уже существующего инструмента. Мои требования довольно просты:
- работает на Win32 (Windows XP SP3, в частности)
- командной строки; мой редактор может работать с любой комбинацией stdin/-out/-err, аргументов, временных файлов и т.д.
- достаточно полная поддержка XSD (в частности, пространства имен и группы замещения)
- сообщает номер строки, в которой произошла ошибка!
Существует ли такой инструмент? Я бы предпочел не устанавливать Visual Studio и друзей (слишком раздутый, IMO), но у меня уже установлены оба Cygwin и Python.
Ответы
Ответ 1
Ваш первый вариант, xmllint (libxml2), дает номера строк для ошибок в xml (а также в xsd). Вероятно, вам просто нужна более поздняя версия. Я только что подтвердил использование моей копии, которая:
> xmllint --version
xmllint: using libxml version 20627
Пример вывода:
invalidXml.xml:4: element c: Schemas validity error : Element 'c': This element is not expected. Expected is ( b ).
invalidXml.xml fails to validate
<?xml version="1.0"?>
<invalidXmlEg>
<a/>
<!-- <b></b> -->
<c/>
</invalidXmlEg>
Где xsd:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="invalidXmlEg">
<xs:complexType>
<xs:sequence>
<xs:element name="a" type="xs:string" />
<xs:element name="b" type="xs:string" />
<xs:element name="c" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
ПРИМЕЧАНИЕ. Я заметил, что xmllint примет имена элементов, которые он не должен (например, "<invalidXml.xsd>
" ), но это не влияет на вашу задачу.
EDIT добавляет часть "скомпилирована с":
compiled with: Threads Tree Output Push Reader
Patterns Writer SAXv1 FTP HTTP DTDValid HTML Legacy
C14N Catalog XPath XPointer XInclude Iconv ISO8859X
Unicode Regexps Automata Expr Schemas Schematron
Modules Debug Zlib
Ответ 2
Как указано выше, libxml xmllint сообщает номера строк - возможно, у вас проблема с версией. Вам может показаться полезным захватить версии libxml/libxslt из http://www.zlatkovic.com/libxml.en.html
Вы также можете взглянуть на msv из Sun. Это не полная реализация XSD, но может выполнить эту работу (я использую ее для проверки RelaxNG в целом)
Ответ 3
Я предлагаю Windows Powershell с PowerShell Community eXtensions. PSCX имеет командлет Test-Xml, который имеет следующее Get-Help
подробное описание:
Тесты на корректность и, необязательно, проверку на соответствие XML-схеме. Он не обрабатывает указание targetName пространство. Чтобы увидеть сообщения об ошибках проверки, укажите флаг -Verbose.
Я не знаю, сообщит ли он об ошибках с помощью linenumbers, но 3 из 4 не плохо.
Ответ 4
Вы можете попробовать один из Visual Studio 2008 Express. В настоящее время значительно улучшена поддержка XML, в том числе проверка достоверности, но также XML Intellisense, фрагменты XML и представление схемы XML.
Ответ 5
Невозможно прокомментировать, но последняя версия xmllint (20708) порт Windows от Игоря Златкович также дает номера строк.
Ответ 6
Xerces-J поставляется с образцом приложения jaxp.SourceValidator. Вы можете подать свой XML файл, и он будет проверять его.
Что касается Xerces-C, я не использовал его сам, но я знаю, что он не требует всего Visual С++, все, что ему нужно, это файлы времени исполнения. Их можно загрузить отдельно от Microsoft. Кажется, что есть пример приложения, которое делает то, что вам нужно - см. StdInParse