Apache Ant/XMLvalidate
您想要一个命令行界面来验证一个或多个 XML 文件。
讲师说明:此文件用作 Apache Ant 课程的实验室练习,该课程包括对 XML 的广泛使用。
您可以使用 Apache Ant 检查一个或一组文件是否有效。这是通过使用 <xmlvalidate> Apache Ant 任务来完成的。xmlvalidate ant 任务将使用标准 ant <fileset> 并遍历并检查每个文件。在下面的示例中,我们使用属性指定了一个名为“in”的目录。然后,我们使用 fileset 查找该目录和该目录的所有子目录中的所有 XML 文件。每个文件都根据 XML 架构成功检查其有效性。
<project default="ValidateXML"> <property name="MYROOTDIR" value="in"/> <target name="ValidateXML" description="Checks that all files at or below MYROOTDIR are well formed"> <xmlvalidate> <fileset dir="${MYROOTDIR}" includes="**/*.xml"/> <attribute name="http://xml.org/sax/features/validation" value="true"/> <attribute name="https://apache.ac.cn/xml/features/validation/schema" value="true"/> <attribute name="http://xml.org/sax/features/namespaces" value="true"/> </xmlvalidate> </target> </project>
在上面的示例中,我们假设每个 XML 文件都有一个指令,告诉它从哪里获取其 XML 架构。
此目标将运行 Ant 附带的默认 XML 解析器(通常是 Xerces)并报告任何格式不正确的文件。
为了测试这一点,您将需要一个小的 XML 架构文件。以下文件读取了三个消息的文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="MyMessage" type="xs:string"/> <xs:element name="MyMessages"> <xs:complexType> <xs:sequence> <xs:element ref="MyMessage" maxOccurs="3"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
这是一个示例消息文件
<?xml version="1.0" encoding="UTF-8"?> <MyMessages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MyMessages.xsd"> <MyMessage>Hello World!</MyMessage> <MyMessage>ANT AND XML Schema ROCK</MyMessage> </MyMessages>
请注意,根元素的 noNamespaceSchemaLocation 属性告诉它在当前目录中查找 XML 架构文件 (MyMessages.xsd)
如果添加第四条消息,该文件应根据上述 XML 架构中的规则验证失败。
<?xml version="1.0" encoding="UTF-8"?> <MyMessages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MyMessages.xsd"> <MyMessage>Hello From XSLT</MyMessage> <MyMessage>From input: Hi</MyMessage> <MyMessage>ANT AND XSLT ROCK</MyMessage> <MyMessage>I am the fourth message.</MyMessage> </MyMessages>
要测试此示例,请添加一个名为“in”的文件夹,并将多个无效的 XML 文件放入该文件夹。在本例中,我们创建了一个名为 MyInputBad.xml 的无效文件。当我们在命令行中键入“build”时,以下是输出结果
ValidateXML: [xmlvalidate] C:\XMLClass\Ant\validate\in\MyInput.xml:6:15: cvc-complex type.2.4.d: Invalid content was found starting with element 'MyMessage'. No child element is expected at this point.
这是一个示例输出。请注意,错误消息没有说明您超出了 3 个数据元素的计数。
如果您在空命名空间中工作,请添加以下属性
<attribute name="https://apache.ac.cn/xml/properties/schema/external-noNamespaceSchemaLocation" value="${xsd.file}"/>
如果您的文档有命名空间,请使用以下方法
<attribute name="http://xml.org/sax/features/namespaces" value="true"/>
<attribute name="https://apache.ac.cn/xml/properties/schema/external-schemaLocation" value="${xsd.file}"/>
如果 XML 文件没有包含它们自己的架构,您还可以创建一个包含在哪里找到 XML 架构的 ant 任务。这是使用特殊的 ant 属性来完成的。
<property name="https://apache.ac.cn/xml/properties/schema/external-noNamespaceSchemaLocation" value="${xsd.file}"/> <xmlvalidate file="xml/endpiece-noSchema.xml" lenient="false" failonerror="true" warn="true"> <attribute name="https://apache.ac.cn/xml/features/validation/schema" value="true"/> <attribute name="http://xml.org/sax/features/namespaces" value="true"/> </xmlvalidate>
Apache ant 还有一个元素可以根据 schematron 规则文件进行验证
<taskdef name="schematron"
classname="com.schematron.ant.SchematronTask"
classpath="lib/ant-schematron.jar"/>
<schematron schema="rules.sch" failonerror="false">
<fileset includes="schmatron-input.xml"/>
</schematron>
有关更多详细信息,请参见 http://www.schematron.com/resource/Using_Schematron_for_Ant.pdf。