271

在办公室,我们目前正在编写一个应用程序,它将根据给定的模式生成 XML 文件。我们在 .XSD 文件中有架构。

是否有可用于自动化测试的工具或库来检查生成的 XML 是否与架构匹配?

我们更喜欢适合商业用途的免费工具,尽管我们不会捆绑模式检查器,因此它只需要开发人员在开发过程中使用。

如果这有什么不同的话,我们的开发语言是 C++,尽管我认为它不应该,因为我们可以生成 xml 文件,然后通过在测试中调用单独的程序进行验证。

4

14 回答 14

248

经过一番研究,我认为最好的答案是Xerces,因为它实现了所有 XSD,是跨平台的并且被广泛使用。我在 github 上创建了一个小型 Java 项目,以使用默认的 JRE 解析器(通常是 Xerces)从命令行进行验证。这可以在 Windows/Mac/Linux 上使用。

如果您更愿意使用它,还可以使用Xerces的C++ 版本。StdInParse实用程序可用于从命令行调用它。此外,下面的评论者指出了这个更完整的包装实用程序

您还可以使用 xmllint,它是libxml的一部分。您可能已经安装了它。示例用法:

xmllint --noout --schema XSD_FILE XML_FILE

一个问题是 libxml 没有实现所有规范,所以你可能会遇到问题:(

或者,如果您在 Windows 上,则可以使用msxml,但您需要某种包装器来调用它,例如此DDJ 文章中描述的 GUI 。但是,Windows 上的大多数人似乎都使用 XML 编辑器,例如 Notepad++(如Nate 的回答中所述)或SteveC 建议的XML Notepad 2007 (还有几个商业编辑器,我不会在这里提及)。

最后,不幸的是,您会发现不同的程序会给出不同的结果。这主要是由于 XSD 规范的复杂性。您可能希望使用多种工具来测试您的架构。

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

于 2008-09-24T19:41:21.853 回答
114

Notepad++有一个名为XML Tools的插件,它提供针对 XSD 的 XML 验证和验证。

您可以在此处查看如何使用它。

于 2009-07-06T18:52:47.600 回答
23

xmlstarlet是一个命令行工具,它将执行此操作以及更多操作:

$ xmlstarlet val --帮助
XMLStarlet 工具包:验证 XML 文档
用法:xmlstarlet val <options> [ <xml-file-or-uri> ... ]
<选项>
  -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 - 不列出文件(仅返回结果代码)

注意:由于 XML 模式不完整,因此尚未完全支持
      libxml2 中的支持(参见 http://xmlsoft.org)

XMLStarlet 是一个用于查询/编辑/检查/转换的命令行工具包
XML 文档(更多信息参见 http://xmlstar.sourceforge.net/)

在您的情况下,用法如下:

xmlstarlet val --xsd your_schema.xsd your_file.xml
于 2008-09-24T01:49:01.710 回答
17

对于 Windows,有免费的XML Notepad 2007。您可以选择 XSD 对其进行验证

更新:更好的是,使用带有 XML 工具插件的 Notepad++

于 2010-10-12T13:19:29.750 回答
4

DecisionSoft的在线XML Schema Validator允许您根据给定的模式检查 XML 文件。

于 2009-06-02T12:49:09.270 回答
3

我使用 Xerces:

http://xerces.apache.org/xerces-c/

于 2008-09-24T01:44:17.993 回答
2

在http://www.xml-buddy.com上提供了一个用于快速简单地验证 XML 的 XML 编辑器

您只需要运行安装程序,然后您就可以使用易于使用的桌面应用程序或命令行来验证您的 XML 文件。此外,您还可以获得对 Schematron 和 RelaxNG 的支持。还支持批量验证...

2012 年 1 月 13 日更新:命令行工具可免费使用,并使用 Xerces 作为 XML 解析器。

于 2009-12-09T08:25:37.510 回答
2

我只是在学习模式。我正在使用 RELAX NG 并使用 xmllint 进行验证。我对来自 xmlllint 的错误感到沮丧。我希望他们能提供更多信息。

如果 XML 中有错误的属性,则 xmllint 会告诉您不受支持的属性的名称。但是,如果您在 XML 中缺少某个属性,您只会收到一条消息,指出无法验证该元素。

我正在使用非常复杂的规则处理一些非常复杂的 XML,而且我是新手,因此跟踪缺少哪个属性需要很长时间。

更新:我刚刚找到了一个我非常喜欢的 java 工具。它可以像 xmllint 一样从命令行运行,并且支持 RELAX NG:https ://msv.dev.java.net/

于 2010-11-23T16:45:21.880 回答
2

我发现这个来自“corefiling”的在线验证器非常有用 -
http://www.corefiling.com/opensource/schemaValidate.html

在尝试了一些工具来验证我的 xsd 之后,这是给我详细错误信息的工具 - 所以我能够修复架构中的错误。

于 2012-05-28T11:31:53.617 回答
1

http://www.xmlvalidation.com/

(请务必选中“针对外部 XML 模式进行验证”框)

于 2009-01-05T19:33:56.763 回答
1

一种从 XML 验证和生成 XSD 的出色可视化工具是 IntelliJ IDEA,直观且简单。

于 2012-10-08T10:43:37.857 回答
1

您可以将 XML 架构连接到 Microsoft Visual Studio 的 Intellisense。此选项为您提供实时验证和自动完成功能,这真是太棒了。

我在我的免费 Microsoft Visual C++ 2010 Express 副本上运行了这个确切的场景。

于 2014-10-10T21:44:40.417 回答
0

我倾向于使用 Microsoft 的 xsd 来帮助从 .NET 文件生成 xsd。我还使用 xmlstarlet 解析出部分 xml。最后一个对您有用的免费工具是 altovaxml,可从以下 URL 获得:http ://www.altova.com/download_components.html 。

这使我可以扫描所有 xml 文件,通过解析 xml 来选择要使用的 xsd。

# Function:
#    verifyschemas - Will validate all xml files in a configuration directory against the schemas in the passed in directory
# Parameters:
#    The directory where the schema *.xsd files are located.  Must be using dos pathing like: VerifySchemas "c:\\XMLSchemas\\"
# Requirements:
#    Must be in the directory where the configuration files are located
#
verifyschemas()
{
    for FILENAME in $(find . -name '*.xml' -print0 | xargs -0)
    do
        local SchemaFile=$1$(getconfignamefromxml $FILENAME).xsd
        altovaxml /validate $FILENAME /schema $SchemaFile > ~/temp.txt 2> /dev/null
        if [ $? -ne 0 ]; then
            printf "Failed to verify: "
            cat ~/temp.txt | tail -1 | tr -d '\r'
            printf "    - $FILENAME with $SchemaFile\n"
        fi
    done
}

要生成 xml,我使用: xsd DOTNET.dll /type:CFGCLASS & rename schema0.xsd CFGCLASS.xsd

要获取我使用的 xsd 名称: xmlstarlet sel -t -m /XXX/* -v local-name() $1 | sed 's/$//'

这允许我使用 xml 文件中的元素标记来获取正确的 XSD。

最终结果是我可以调用 bash 函数来扫描所有 XML 文件并验证它们。即使它们位于多个子目录中。

于 2012-05-22T18:53:33.610 回答
0

另一个在线 XML Schema (XSD) 验证器:http ://www.utilities-online.info/xsdvalidation/ 。

于 2015-07-22T06:13:46.413 回答