代码之家  ›  专栏  ›  技术社区  ›  cetnar

Maven中的XML DTD/模式验证

  •  6
  • cetnar  · 技术社区  · 16 年前

    如何在Maven构建期间根据DTD或XSD模式验证XML文档?

    3 回复  |  直到 8 年前
        1
  •  3
  •   Community Mohan Dere    10 年前

    有一个 xml-maven-plugin 可以检查XML文件是否 matching an XML schema 但我认为它不能生成报告。

        2
  •  4
  •   pjvleeuwen    10 年前

    这个 validate goal 的XML Maven插件将检查格式是否正确,并根据模式进行可选验证。如果验证失败,则生成将失败。

    该插件不生成任何报告,出于兴趣,您希望在报告中包含什么?有关无效文件的信息?

    下面是一个示例用法:

      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>xml-maven-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>validate</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <validationSets>
            <validationSet>
              <dir>src/main/xsd</dir>
              <systemId>src/main/xmlschema.xml</systemId>
            </validationSet>
          </validationSets>
        </configuration>
      </plugin>
    
        3
  •  0
  •   Community Mohan Dere    9 年前

    我已经用过了 xml-maven-plugin 有一段时间(感谢 Pascal Thivent Rick Seller 因为我介绍了这个),但有一些问题。

    我正在验证一个XML文档。在某种程度上,我们将XML文档分成两个文件,都在各自的子目录中。此时,XML Maven插件不再验证任何内容,因为文件已被移动,但也没有抱怨。另外,我个人认为配置不太直观,如果您不期望的话,调试起来有点困难。

    所以对我来说,我很高兴重新发现 schemavalidate 蚂蚁任务与 maven-antrun-plugin . 做了我需要的一切。

    在下面的示例中,我检查文件是否实际被选中。当然,你可以根据你的具体需要来定制这个。作为一个额外的(有点脱离主题)一个例子,我如何获取作为依赖项下载的XSD的路径。

    <build>
        <plugins>
            <plugin><groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId><version>1.8</version>
                <executions><execution>
                    <id>validate-xml-document-files-against-schema</id>
                    <phase>test</phase>
                    <goals><goal>run</goal></goals>
                    <configuration>
                        <target>
                            <copy file="${maven.dependency.com.mycompany.some-schema.xsd.path}" tofile="${xml-validation-dir}/some-schema.xsd" />
                            <resourcecount property="xml.count">
                                <fileset dir="${xml-validation-dir}" includes="**/*.xml" />
                            </resourcecount>
                            <fail message="fileset does not match any xml file (use same fileset for actual validation)">
                                <condition><equals arg1="${xml.count}" arg2="0" /></condition>
                            </fail>
                            <echo message="validating ${xml.count} xml files against some-schema" />
                            <schemavalidate>
                                <schema namespace="http://mycompany.com/some-namespace" file="${xml-validation-dir}/some-schema.xsd" />
                                <fileset dir="${xml-validation-dir}" includes="**/*.xml" />
                            </schemavalidate>
                            <echo message="all ${xml.count} xml documents are valid" />
                        </target>
                    </configuration>
                </execution></executions>
            </plugin>
        </plugins>
    </build>
    
    <dependencies>
        <dependency>
            <groupId>com.mycompany</groupId>
            <artifactId>some-schema-artifact</artifactId>
            <version>1.2.3</version>
            <type>xsd</type>
        </dependency>
    </dependencies>
    

    当然,这并不真正适合于特立独行的工作方式,但它对我很有效,也许其他人知道这个选择会有所帮助。