Средство проверки 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