XML模式(XSD)validation工具?
在办公室,我们正在编写一个应用程序,将根据我们提供的模式生成XML文件。 我们有一个.XSD文件中的模式。
是否有工具或库可用于自动化testing,以检查生成的XML是否与模式匹配?
我们宁愿使用适合商业用途的免费工具,尽pipe我们不会捆绑模式检查器,所以在开发过程中只需要开发人员使用。
我们的开发语言是C ++,如果有什么区别的话,尽pipe我不认为它应该是我们可以生成XML文件,然后通过在testing中调用单独的程序来进行validation。
经过一番研究,我认为最好的答案是Xerces ,因为它实现了所有的XSD,是跨平台的,被广泛使用的。 我在github上创build了一个小的Java项目,使用默认的JREparsing器(通常是Xerces)从命令行进行validation。 这可以在Windows / Mac / Linux上使用。
如果你愿意使用Xerces,也可以使用C ++版本 。 可以使用StdInParse实用程序从命令行调用它。 另外,下面的评论者指出这个更完整的包装工具 。
您也可以使用xmlllint,它是libxml的一部分。 你可能已经安装了它。 用法示例:
xmllint --noout --schema XSD_FILE XML_FILE
一个问题是libxml没有实现所有的规范,所以你可能会遇到的问题:(
另外,如果你在Windows上,你可以使用msxml ,但是你需要一些包装器来调用它,比如在这篇DDJ文章中描述的GUI。 但是,大多数Windows用户似乎都使用了SteveC所build议的XML编辑器,如Notepad ++(如Nate的回答中所述 )或XML Notepad 2007 (这里也有几个商业编辑,我不会在这里提到)。
最后,不幸的是,你会发现不同的程序会给出不同的结果。 这主要是由于XSD规范的复杂性。 你可能想用几个工具来testing你的模式。
更新 :我已经在博客文章中进行了扩展。
Notepad ++有一个名为XML Tools的插件,可以对XSD进行XMLvalidation和validation。
你可以在这里看到如何使用它。
xmlstarlet是一个命令行工具,可以做到这一点和更多:
$ xmlstarlet val --help XMLStarlet工具包:validationXML文档 用法:xmlstarlet val <选项> [<xml-file-or-uri> ...] 其中<选项> -w或--well-formed - 只validation良构(默认) -d或--dtd <dtd-file> - 针对DTD进行validation -s或--xsd <xsd-file> - 根据XSD模式进行validation -E或--embed - 使用embedded式DTD进行validation -r或--relaxng <rng-file> - 针对Relax-NG模式进行validation -e或--err - 在stderr上打印详细的错误消息 -b或--list-bad - 仅列出不validation的文件 -g或--list-good - 仅列出validation的文件 -q或--quiet - 不列出文件(仅返回结果代码) 注:由于XML Schema不完整,尚未完全支持XML Schema 支持libxml2(请参阅http://xmlsoft.org) XMLStarlet是一个查询/编辑/检查/转换的命令行工具包 XML文档(更多信息请参阅http://xmlstar.sourceforge.net/)
在你的情况下的用法将是:
xmlstarlet val --xsd your_schema.xsd your_file.xml
对于Windows,有免费的XML Notepad 2007 。 您可以selectXSD进行validation
DecisionSoft的在线XML模式validation器允许您根据给定的模式检查XML文件。
我使用Xerces:
http://www.xml-buddy.com提供了一个XML编辑器,用于快速简单的XMLvalidation
您只需要运行安装程序,之后就可以使用易于使用的桌面应用程序或命令行validation您的XML文件。 此外,您还可以获得对Schematron和RelaxNG的支持。 批处理validation也支持…
2012年1月13日更新:命令行工具可以自由使用,并使用Xerces作为XMLparsing器。
(请务必检查“对外部XML模式validation”框)
我只是在学习Schema。 我正在使用RELAX NG并使用xmllint进行validation。 我感到沮丧的xmlllint出来的错误。 我希望他们有更多的信息。
如果XML中存在错误的属性,则xmllint会告诉您不支持的属性的名称。 但是,如果您在XML中缺less一个属性,您只会收到一条消息,指出该元素无法validation。
我正在处理一些非常复杂的规则非常复杂的XML,而且我对这个新手很陌生,因此追踪哪些属性丢失需要很长时间。
更新:我刚刚发现了一个我喜欢的Java工具。 它可以从命令行运行,如xmllint,它支持RELAX NG: https ://msv.dev.java.net/
我发现这个来自“corefiling”的在线validation器非常有用 –
http://www.corefiling.com/opensource/schemaValidate.html
尝试了几个工具来validation我的xsd后,这是给了我详细的错误信息 – 所以我能够修复模式中的错误。
一个很好的可视化工具来validation和生成XML的XSD是IntelliJ IDEA,直观而简单。
您可以将您的XML架构连接到Microsoft Visual Studio的Intellisense。 这个选项给你实时validation和自动完成,这真是太棒了。
我有这个确切的场景运行在我的免费副本的Microsoft Visual C ++ 2010 Express。
另一个在线XML Schema(XSD)validation器: http : //www.utilities-online.info/xsdvalidation/ 。
我倾向于使用Microsoft的xsd来帮助从.NET文件生成xsd。 我也使用xmlstarletparsing了xml的部分。 对你来说最终的免费工具是altovaxml,可以通过以下url获得: http : //www.altova.com/download_components.html 。
这允许我通过parsingxml来扫描所有的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文件并validation它们。 即使他们在多个子目录中。