跳转到内容

Apache Ant/XMLvalidate

来自维基教科书,开放的书籍,为开放的世界

您想要一个命令行界面来验证一个或多个 XML 文件。

讲师说明:此文件用作 Apache Ant 课程的实验室练习,该课程包括对 XML 的广泛使用。

您可以使用 Apache Ant 检查一个或一组文件是否有效。这是通过使用 <xmlvalidate> Apache Ant 任务来完成的。xmlvalidate ant 任务将使用标准 ant <fileset> 并遍历并检查每个文件。在下面的示例中,我们使用属性指定了一个名为“in”的目录。然后,我们使用 fileset 查找该目录和该目录的所有子目录中的所有 XML 文件。每个文件都根据 XML 架构成功检查其有效性。

验证文件夹中所有 XML 文件的示例 Ant 任务

[编辑 | 编辑源代码]
<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 架构 MyMessages.xsd

[编辑 | 编辑源代码]

为了测试这一点,您将需要一个小的 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 个数据元素的计数。

提供 XML 架构定义文件

[编辑 | 编辑源代码]

如果您在空命名空间中工作,请添加以下属性

  <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>

Schematron 验证

[编辑 | 编辑源代码]

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

上一章下一章

参考资料

[编辑 | 编辑源代码]
华夏公益教科书