在办公室,我们目前正在编写一个应用程序,它将根据给定的模式生成XML文件。我们在. xsd文件中拥有模式。
是否有工具或库可以用于自动测试,以检查生成的XML是否与模式匹配?
我们更喜欢适合商业用途的免费工具,尽管我们不会捆绑模式检查器,因此它只需要在开发过程中供开发人员使用。
我们的开发语言是c++,如果这有什么不同的话,尽管我不认为它应该,因为我们可以生成xml文件,然后通过在测试中调用一个单独的程序来进行验证。
在办公室,我们目前正在编写一个应用程序,它将根据给定的模式生成XML文件。我们在. xsd文件中拥有模式。
是否有工具或库可以用于自动测试,以检查生成的XML是否与模式匹配?
我们更喜欢适合商业用途的免费工具,尽管我们不会捆绑模式检查器,因此它只需要在开发过程中供开发人员使用。
我们的开发语言是c++,如果这有什么不同的话,尽管我不认为它应该,因为我们可以生成xml文件,然后通过在测试中调用一个单独的程序来进行验证。
当前回答
经过一番研究,我认为最好的答案是Xerces,因为它实现了XSD的所有功能,是跨平台的,而且被广泛使用。我在github上创建了一个小型Java项目,使用默认的JRE解析器(通常是Xerces)从命令行进行验证。这可以在Windows/Mac/Linux上使用。
如果您愿意使用的话,还有一个c++版本的Xerces可用。可以使用StdInParse实用程序从命令行调用它。此外,下面的一个评论指出了这个更完整的包装实用程序。
还可以使用xmllint,它是libxml的一部分。您很可能已经安装了它。使用示例:
xmllint --noout --schema XSD_FILE XML_FILE
一个问题是libxml并没有实现所有的规范,所以你可能会遇到问题:(
或者,如果您使用的是Windows,则可以使用msxml,但需要某种包装器来调用它,例如DDJ文章中描述的GUI。然而,似乎Windows上的大多数人都使用XML编辑器,比如notepad++(如Nate的回答中所描述的)或SteveC建议的XML notepad2007(还有一些商业编辑器,我在这里不提)。
最后,你会发现,不幸的是,不同的程序会给出不同的结果。这主要是由于XSD规范的复杂性。您可能希望使用几种工具来测试您的模式。
更新:我在一篇博客文章中对此进行了扩展。
其他回答
我只是在学习图式。我使用RELAX NG和使用xmllint来验证。我对xmllint中出现的错误感到沮丧。我希望他们能提供更多信息。
如果XML中有错误的属性,那么xmllint会告诉您不受支持的属性的名称。但是,如果XML中缺少某个属性,则会收到一条消息,说该元素无法验证。
我正在处理一些具有非常复杂规则的非常复杂的XML,而且我是新手,因此追踪缺少哪个属性花费了很长时间。
更新:我刚刚发现了一个我很喜欢的java工具。它可以像xmllint一样从命令行运行,并且它支持RELAX NG: https://msv.dev.java.net/
我倾向于使用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. dllxsd CFGCLASS.xsd
要获得xsd名称,我使用: xmlstarlet sel -t -m /XXX/* -v local-name() $1 | sed 's/ $//'
这允许我使用xml文件中的元素标记拾取正确的XSD。
最终结果是,我可以调用一个bash函数来扫描所有XML文件并验证它们。即使它们在多个子目录中。
Windows有免费的XML记事本2007。 您可以选择用于验证的XSD
更新:更好的是,使用notepad++和XML Tools插件
经过一番研究,我认为最好的答案是Xerces,因为它实现了XSD的所有功能,是跨平台的,而且被广泛使用。我在github上创建了一个小型Java项目,使用默认的JRE解析器(通常是Xerces)从命令行进行验证。这可以在Windows/Mac/Linux上使用。
如果您愿意使用的话,还有一个c++版本的Xerces可用。可以使用StdInParse实用程序从命令行调用它。此外,下面的一个评论指出了这个更完整的包装实用程序。
还可以使用xmllint,它是libxml的一部分。您很可能已经安装了它。使用示例:
xmllint --noout --schema XSD_FILE XML_FILE
一个问题是libxml并没有实现所有的规范,所以你可能会遇到问题:(
或者,如果您使用的是Windows,则可以使用msxml,但需要某种包装器来调用它,例如DDJ文章中描述的GUI。然而,似乎Windows上的大多数人都使用XML编辑器,比如notepad++(如Nate的回答中所描述的)或SteveC建议的XML notepad2007(还有一些商业编辑器,我在这里不提)。
最后,你会发现,不幸的是,不同的程序会给出不同的结果。这主要是由于XSD规范的复杂性。您可能希望使用几种工具来测试您的模式。
更新:我在一篇博客文章中对此进行了扩展。
我使用Xerces:
http://xerces.apache.org/xerces-c/