XML Schema(XSD)验证工具?

时间:2008-09-24 01:19:54

标签: xml validation xsd schema

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

我们是否可以使用工具或库进行自动化测试,以检查生成的XML是否与架构匹配?

我们更喜欢适合商业用途的免费工具,尽管我们不会捆绑架构检查器,因此开发期间只需要开发人员使用它。

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

14 个答案:

答案 0 :(得分:234)

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

如果您更愿意使用它,还可以使用C++ version of XercesStdInParse utility可用于从命令行调用它。此外,下面的评论者指向此more complete wrapper utility

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

xmllint --noout --schema XSD_FILE XML_FILE

一个问题是libxml没有实现所有规范,因此您可能遇到问题:(

或者,如果您使用的是Windows,则可以使用msxml,但是需要使用某种包装来调用它,例如此DDJ article中描述的GUI。但是,似乎Windows上的大多数人使用XML编辑器,例如Notepad ++(如Nate's answer中所述)或XML Notepad 2007作为suggested by SteveC(还有一些商业编辑,我不会这里提一下。)

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

更新:我已在blog post进行了扩展。

答案 1 :(得分:111)

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

您可以看到如何使用它here

答案 2 :(得分:22)

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

$ xmlstarlet val --help
XMLStarlet Toolkit: Validate XML document(s)
Usage: xmlstarlet val <options> [ <xml-file-or-uri> ... ]
where <options>
  -w or --well-formed        - validate well-formedness only (default)
  -d or --dtd <dtd-file>     - validate against DTD
  -s or --xsd <xsd-file>     - validate against XSD schema
  -E or --embed              - validate using embedded DTD
  -r or --relaxng <rng-file> - validate against Relax-NG schema
  -e or --err                - print verbose error messages on stderr
  -b or --list-bad           - list only files which do not validate
  -g or --list-good          - list only files which validate
  -q or --quiet              - do not list files (return result code only)

NOTE: XML Schemas are not fully supported yet due to its incomplete
      support in libxml2 (see http://xmlsoft.org)

XMLStarlet is a command line toolkit to query/edit/check/transform
XML documents (for more information see http://xmlstar.sourceforge.net/)

在您的情况下的用法将遵循:

xmlstarlet val --xsd your_schema.xsd your_file.xml

答案 3 :(得分:14)

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

答案 4 :(得分:5)

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

答案 5 :(得分:3)

答案 6 :(得分:3)

http://www.xml-buddy.com

提供了一种用于快速简便的XML验证的XML编辑器

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

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

答案 7 :(得分:2)

http://www.xmlvalidation.com/

(请务必选中“验证外部XML架构”框)

答案 8 :(得分:2)

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

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

我正在制作一些非常复杂的XML,并且规则非常复杂,我是新手,所以追踪哪个属性缺失需要很长时间。

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

答案 9 :(得分:2)

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

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

答案 10 :(得分:1)

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

答案 11 :(得分:1)

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

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

答案 12 :(得分:1)

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

答案 13 :(得分: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&amp;重命名schema0.xsd CFGCLASS.xsd

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

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

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