XML Schema(XSD)验证工具?

275

我们公司目前正在编写一个应用程序,根据给定的模式生成XML文件。我们有一个.XSD文件来描述该模式。

是否有工具或库可用于自动化测试以检查生成的XML是否符合模式?

我们希望使用适合商业环境的免费工具,尽管我们不会捆绑模式检查器,但它仅需要在开发过程中由开发人员使用。

我们的开发语言是C++,如果有任何区别,我们可以生成XML文件,然后通过调用测试中的单独程序进行验证。


158
我喜欢很多“不具建设性”的问题成为我所搜寻的一些东西在谷歌搜索中的最佳结果,并且这些答案是有用的。 - matt freake
2
我理解他们所说的“不具建设性”的意思。但老实说,这是一个很好的问题,有时候辩论和争论最终会导致出色的答案。 - Matt
26
这正是管理员适得其反的情况。 - fIwJlxSzApHEZIl
也许值得在Maven构建工具的背景下查看一个类似的问题 - Alberto
请尝试访问 https://codverter.com/src/xmltoxsd。 - Jonathan Applebaum
14个回答

251

经过一番调查,我认为最好的答案是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 规范的复杂性造成的。你可能需要用几个工具测试你的架构。

更新:我在博客文章中对此进行了扩展。


1
我发现以下内容很有帮助:http://jmvanel.free.fr/xsd/README.html - Matthew Hegarty
一个在Linux上使用的StdinParse示例可能会很有用:StdInParse -n -s -f -v=always < XML_FILE。XML_FILE应包括模式位置。对我来说,它比xmllint给出了更完整的结果。 - helcim
3
有没有一种方法可以要求程序使用xsi:schemaLocation而不是手动提供所有XSD? - Gabor Garami
2
很遗憾,xmllint不符合XML正则表达式的规范,因此一些有效的XML正则表达式将无法通过它。 - Sergey Bushmanov
你的博客文章链接返回一个非常可疑的PDF,其中只包含指向可疑俄罗斯域的链接。 - ColinMaudry
显示剩余5条评论

117

有一个叫做 Notepad++ 的插件,名为 XML Tools,它可以对XML文件进行验证,并根据XSD文件进行验证。

您可以在此处了解如何使用它。


5
这个插件安装起来很麻烦。 - jcollum
2
我使用npp 5.8.6,XMLTools 2.3.1 unicode beta2 r805 进行了测试,它运行良好。 - Palani
5
很棒的插件。查看Notepad++ XmlTools Not Installing以获取安装帮助。 - ladenedge
17
在版本5.8.7中,Notepad++的插件管理器(“插件/插件管理器”)使安装过程自动化。 - Fueled
1
@FranzEbner 我也遇到了同样的问题。如果 XML 文件本身引用了一个 XSD 文件,例如 xsi:noNamespaceSchemaLocation="file.xsd",那么 XML 工具将尝试使用它而不是给你一个“设置”对话框。 - theblang
显示剩余7条评论

24

xmlstarlet 是一个命令行工具,它可以完成以下操作:

$ 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

3
你知道不完全支持XML模式的警告有多严重吗? - Jason Dagit
2
从其他答案来看,xmlstarlet在其xsd实现方面有些薄弱。 - Jason Dagit
3
由于xmlstarlet实际上是在libxml2的基础上构建的,因此使用libxml2捆绑的xmllint可能更容易,并且已经在被接受的答案中解释了。 - Adrian Mouat
@JasonDagit,...它的弱点正好与xmllint一样弱--它们使用相同的库实现。 - Charles Duffy
内容模型不是确定性的。 :-( - Greg

17
对于Windows平台,有免费的XML Notepad 2007。您可以选择XSD文件进行验证。 更新:更好的选择是使用带有XML Tools插件的Notepad++。

4

来自DecisionSoft的在线XML Schema验证器允许您根据给定的模式检查XML文件。


1
链接不再可用... - ubuntudroid
1
现在可以访问它了 - 它将重定向到http://www.corefiling.com/opensource/schemaValidate.html - JDonner
1
在线工具是一个安全问题。 - Dragas

3

1
他们有没有命令行可以从控制台使用,来检查XSLT 2.0的XSD文件验证XSLT文件的有效性? - Alexis Wilke
是的,您可以使用“sudo apt install libxerces-c-samples”安装CLI工具,然后使用“StdInParse -v = always -n -s <document.xml”检查文档。 - jgrocha

2
http://www.xml-buddy.com,你可以找到一个XML编辑器,用于快速轻松地进行XML验证。只需运行安装程序,之后便可以使用易于使用的桌面应用程序或命令行验证你的XML文件。此外,还支持Schematron和RelaxNG,并支持批量验证...更新于1/13/2012: 命令行工具免费使用,使用Xerces作为XML解析器。

2
我正在学习Schema,使用RELAX NG并使用xmllint进行验证。我对xmllint输出的错误感到沮丧。希望它们能更详细地说明问题。
如果XML中有错误的属性,则xmllint会告诉您不支持的属性名称。但是,如果XML缺少属性,则只会收到一个消息,指示无法验证元素。
我正在处理一些非常复杂的XML,具有非常复杂的规则,并且我是新手,因此查找缺少的属性需要很长时间。
更新:我刚刚发现了一个我很喜欢的Java工具。它可以像xmllint一样从命令行运行,并支持RELAX NG:https://msv.dev.java.net/

2

在线工具是一个安全问题。 - Dragas

1
你可以将XML架构连接到Microsoft Visual Studio的Intellisense。这个选项可以提供实时验证和自动完成,非常棒。
我在免费的Microsoft Visual C++ 2010 Express上运行了这个确切的场景。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接