我们公司目前正在编写一个应用程序,根据给定的模式生成XML文件。我们有一个.XSD文件来描述该模式。
是否有工具或库可用于自动化测试以检查生成的XML是否符合模式?
我们希望使用适合商业环境的免费工具,尽管我们不会捆绑模式检查器,但它仅需要在开发过程中由开发人员使用。
我们的开发语言是C++,如果有任何区别,我们可以生成XML文件,然后通过调用测试中的单独程序进行验证。
我们公司目前正在编写一个应用程序,根据给定的模式生成XML文件。我们有一个.XSD文件来描述该模式。
是否有工具或库可用于自动化测试以检查生成的XML是否符合模式?
我们希望使用适合商业环境的免费工具,尽管我们不会捆绑模式检查器,但它仅需要在开发过程中由开发人员使用。
我们的开发语言是C++,如果有任何区别,我们可以生成XML文件,然后通过调用测试中的单独程序进行验证。
经过一番调查,我认为最好的答案是Xerces,因为它实现了所有的XSD规范,跨平台并且被广泛使用。我在GitHub上创建了一个小型Java项目,可以使用默认的JRE解析器进行命令行验证,通常情况下这个解析器就是Xerces。这可以在Windows/Mac/Linux上使用。
如果您更喜欢使用C++,也有Xerces的C++版本可用。可以使用StdInParse实用程序从命令行调用它。此外,下面的评论者指出这个更完整的包装工具。
您还可以使用xmllint,它是libxml的一部分。您可能已经安装了它。以下是示例用法:
xmllint --noout --schema XSD_FILE XML_FILE
一个问题是libxml没有实现所有的规范,因此你可能会遇到问题 :(
或者,如果你用的是 Windows,你可以使用msxml,但你需要一些包装器来调用它,比如在这篇DDJ文章中描述的 GUI 包装器。然而,似乎大多数人在 Windows 上使用 XML 编辑器,例如 Notepad++(在Nate 的回答中有介绍)或XML Notepad 2007,如SteveC 建议的(也有几个商业编辑器,这里不再赘述)。
最后,你会发现不同的程序会给出不同的结果,这很大程度上是由于 XSD 规范的复杂性造成的。你可能需要用几个工具测试你的架构。
更新:我在博客文章中对此进行了扩展。
xmllint
不符合XML正则表达式的规范,因此一些有效的XML正则表达式将无法通过它。 - Sergey BushmanovXML
文件本身引用了一个 XSD
文件,例如 xsi:noNamespaceSchemaLocation="file.xsd"
,那么 XML 工具将尝试使用它而不是给你一个“设置”对话框。 - theblangxmlstarlet 是一个命令行工具,它可以完成以下操作:
$ xmlstarlet val --help XMLStarlet 工具箱:验证 XML 文档 用法: xmlstarlet val <options> [ <xml-file-or-uri> ... ] 其中 <options> -w 或 --well-formed - 仅验证格式是否正确(默认) -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 - 不列出文件(只返回结果代码)
注意:由于 libxml2 对 XML Schema 的支持不完整,因此 XML Schema 目前还没有完全支持(请参阅 http://xmlsoft.org)。
XMLStarlet 是一个命令行工具箱,可用于查询/编辑/检查/转换 XML 文档(有关更多信息,请访问 http://xmlstar.sourceforge.net/)。
在您的情况下,使用方法类似于:
xmlstarlet val --xsd your_schema.xsd your_file.xml
来自DecisionSoft的在线XML Schema验证器允许您根据给定的模式检查XML文件。
我发现“corefiling”提供的在线验证器非常有用 -
http://www.corefiling.com/opensource/schemaValidate.html
在尝试了几个验证xsd的工具后,这是唯一一个给出详细错误信息的工具 - 因此我能够修复模式中的错误。