【问题标题】:Command-line XML validator for Windows适用于 Windows 的命令行 XML 验证器
【发布时间】:2010-11-13 10:43:04
【问题描述】:

我一直发现针对模式的验证是对抗 thinkos 的无价之宝,我希望将验证检查作为项目的一部分,我经常需要手写几百行长度的 XML 文件。我的文本编辑器有一个相当不错的 CLI 集成功能,所以我正在寻找一个命令行验证器。

当我没有通过 Google 找到任何明确的赢家时,我在这里四处寻找并找到了一个 similar question,但那里建议的工具都不太适合我的需求:

  • libxml(通过 cygwin)——不报告行号;我不知道哪里我的错误在哪里!
  • msxml — 不能从命令行运行?
  • xerces-c — 似乎需要 Visual C 的副本?
  • xerces2-j — 不能从命令行运行?
  • xmlstarlet — XSD 支持不足*

(*我验证的架构使用了替换组 - 不恰当,但它在项目外部,所以我无法更改它 - 这导致 xmlstarlet 即使在有效文件上也会阻塞。)

通常,这是解决问题的关键点“臭名昭著”。

所以我又回来寻找一个预先存在的工具。我的要求很简单:

  • 在 Win32 上运行(特别是 Windows XP SP3)
  • 命令行;我的编辑器可以使用标准输入/输出/-err、参数、临时文件等的任意组合。
  • 相当完整的 XSD 支持(尤其是命名空间和替换组)
  • 报告发生错误的行号!

这样的工具存在吗?我不想安装 Visual Studio 和朋友(太臃肿,IMO),但我已经安装了 Cygwin 和 Python。

【问题讨论】:

    标签: windows xml validation command-line xsd


    【解决方案1】:

    您可以尝试Visual Studio 2008 Express 版本之一。现在有更好的 XML 支持,当然包括验证,还有 XML Intellisense、XML sn-ps 和 XML Schema 视图。

    【讨论】:

    • 我怀疑 devenv 可以在命令行上验证 XML 文件。
    • 我不建议这样做。我建议 UI 体验可能足以改变您使用 XML 文件的方式。
    【解决方案2】:

    我建议Windows PowershellPowerShell Community eXtensions。 PSCX 有 Test-Xml cmdlet,它有以下Get-Help 详细描述:

    测试格式是否正确,并可选择根据 XML Schema 进行验证。它不处理指定目标名称 空间。要查看验证错误消息,请指定 -Verbose 标志。

    我不知道它是否会用 linenumbers 报告错误,但 3 out 4 还不错。

    【讨论】:

      【解决方案3】:

      您的第一个选项 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 会接受它不应该接受的元素名称(例如“&lt;invalidXml.xsd&gt;”),但这似乎不会影响您的任务。

      EDIT 添加版本的“compiled with”部分:

       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 
      

      【讨论】:

      • 有趣!我使用的版本是 20703,它产生“Element 'c': This element is not expected. Expected is ( b ).”(几乎相同,但缺少行号)。我得看看能不能挖出旧版本。
      • 似乎倒退了一步......我想知道他们是否添加了一个选项,是否包含行号?可能值得检查文档(也许 --verbose)。或者......也许这与编译的内容有关?我没有包括它,但我会添加它(我也在 linux 上运行,这不应该有任何区别):它编译为:线程树输出推送阅读器模式编写器 SAXv1 FTP HTTP DTDValid HTML Legacy C14N 目录XPath XPointer XInclude Iconv ISO8859X Unicode Regexps Automata Expr Schemas Schematron Modules Debug Zlib
      • 貌似Cygwin中libxml的版本是用同样的选项编译的,好像没有--verbose样的选项。我最终从官方网站获取了 2.6.27 的 Win32 二进制文件,它工作得很好。确实是倒退了一步。 :-)
      【解决方案4】:

      Xerces-J 附带一个示例应用程序,jaxp.SourceValidator。您可以将您的 XML 文件提供给它,它会验证它。

      至于 Xerces-C,我自己没用过,但我知道它不需要所有的 Visual C++,它只需要 runtime 文件。这些可以从 Microsoft 单独下载。似乎有一个示例应用程序可以满足您的需求 - 请参阅 StdInParse

      【讨论】:

        【解决方案5】:

        正如上面所说的 13ren,libxml 的 xmllint 确实报告了行号——也许你有版本问题。您可能会发现从 http://www.zlatkovic.com/libxml.en.html 获取 libxml/libxslt 工具的本机(非 cygwin)版本很有用

        您可能还想查看来自Sun 的 msv。它不是 XSD 的完整实现,但可能会完成这项工作(我通常将其用于 RelaxNG 验证)

        【讨论】:

          【解决方案6】:

          无法评论,但来自 Igor Zlatkovic 的 xmllint (20708) Windows 端口的最新版本也提供了行号。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-02
            • 2010-10-07
            • 1970-01-01
            • 2011-03-28
            相关资源
            最近更新 更多