XML Schema(XSD)验证工具?[关闭]


266

当前,我们在办公室正在编写一个应用程序,该应用程序将根据给定的模式生成XML文件。我们在.XSD文件中包含模式。

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

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

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


132
我喜欢这些“非建设性”问题中有多少是Google搜索的最热门的搜索结果,并且答案是有用的
matt freake

1
我理解非建设性的内容来自何处。坦白地说,尽管这是一个很好的问题,辩论/争论有时最终会得出很好的答案
Matt

22
这是管理员生产
适得其反

Maven构建工具的上下文中,可能值得研究一个类似的问题
Alberto 2014年

Answers:


239

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

如果您愿意的话,还有XercesC ++版本。所述StdInParse实用程序可用于在命令行调用它。另外,下面的注释者指向此更完整的包装器实用程序

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

xmllint --noout --schema XSD_FILE XML_FILE

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

另外,如果您使用的是Windows,则可以使用msxml,但需要某种包装程序来调用它,例如DDJ文章中介绍的GUI 。然而,似乎大多数人都在Windows上使用XML编辑器,如记事本++(如描述Nate的答案)或XML记事本2007年作为由SteveC建议(也有,我不会在这里提几个商业编辑)。

最后,不幸的是,您会发现不同的程序会产生不同的结果。这主要是由于XSD规范的复杂性。您可能想用几种工具测试您的模式。

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



一个示例StdinParse用法(在Linux上)迁移很有用:StdInParse -n -s -f -v = always <XML_FILE。XML_FILE应该包含架构位置。对我来说,它提供了比xmllint更完整的结果。
helcim

3
有没有办法让程序使用xsi:schemaLocation而不是手动提供所有XSD?
Gabor Garami 2014年

@GaborGarami目前还不行,但这是一个功能请求:github.com/amouat/xsd-validator/issues/5
Adrian Mouat

1
xmllint不幸的是,它不符合XML正则表达式,因此某些有效的XML正则表达式将无法通过它
Sergey Bushmanov 2016年

112

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

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


5
-1,此插件很难安装
jcollum 2010年

2
我用npp 5.8.6,XMLTools 2.3.1 unicode beta2 r805进行了测试,它工作正常。
Palani

5
很棒的插件。请参阅“ Notepad ++ XmlTools未安装”获取安装帮助。
ladenedge 2011年

16
对于版本5.8.7,Notepad ++自己的插件管理器(“插件/插件管理器”)使安装过程自动进行。
加油

1
@FranzEbner我有同样的问题。如果XML本身引用了一个XSD文件,例如xsi:noNamespaceSchemaLocation="file.xsd",那么XML Tools将尝试使用该文件,而不是给您“设置”对话框。
theblang

22

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

$ xmlstarlet val-帮助
XMLStarlet Toolkit:验证XML文档
用法:xmlstarlet val <选项> [<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-不列出文件(仅返回结果代码)

注意:由于XML模式不完整,因此尚未完全支持
      libxml2中的支持(请参阅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实现上有些薄弱。
杰森·达吉特

3
鉴于xmlstarlet仅在内部使用libxml2,因此仅使用与libxml2捆绑在一起并在已接受的答案中进行解释的xmllint可能会更容易。
Adrian Mouat

@JasonDagit,...与xmllint一样弱,它们使用相同的库实现。
查尔斯·达菲

内容模型不是确定性的。:-(
格雷格





2

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

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

我正在使用一些非常复杂的规则处理非常复杂的XML,对此我是陌生的,因此要查找缺少的属性会花费很长时间。

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



2

可通过http://www.xml-buddy.com获得用于快速简便地进行XML验证的XML编辑器

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

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


1

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


1

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

我在Microsoft Visual C ++ 2010 Express的免费副本上运行了此确切方案。



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并重命名schema0.xsd CFGCLASS.xsd

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

这使我可以使用xml文件中的element标记拾取正确的XSD。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.