使用OASIS XML Catalog(Maven或Ant)进行XML模式验证

时间:2012-08-20 12:31:12

标签: xml ant xsd maven-3 xml-validation

我正在尝试为我们公司的XSD设置一个产品,用于验证针对这些XSD的大量XML文件。

我们的项目基于maven,我使用ant脚本生成目录文件(这样可以更容易地将所有这些模式添加到eclipse实例中)。

我遇到的问题是我无法设置maven或ant任务,通过使用XML目录来验证针对这些模式的大量示例xml文件。我不想为所有这些模式明确定义URN到XSD规则(这就是我拥有的XML Catalg)。

我尝试过以下设置:

的Maven

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>xml-maven-plugin</artifactId>
    <version>1.0</version>
    <executions>
        <execution>
            <goals>
                <goal>validate</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <catalogs>
            <catalog>${project.build.outputDirectory}/catalog.xml</catalog>
        </catalogs>
        <validationSets>
            <validationSet>
                <dir>src/test/xml</dir>
                <validating>true</validating>
            </validationSet>
        </validationSets>
    </configuration>
</plugin>

这无法解析catalog.xml。 base catalog.xml包含相对的nextCatalog条目,这些条目未正确扩展(绝对路径错误)。当我直接将2个catalog.xml条目添加到pom时,只解析第一个。

但即使只解析了第一个catalog.xml文件也无法验证xml文件:

 line 4,  column 191: cvc-elt.1: Cannot find the declaration of element 'mtc:SERVICE_ORDER_MSG'.

示例XML文件是有效的,因此显然maven不会将通过目录加载的模式与验证器链接。使用-X,我确实看到它处理目录并查看模式及其名称空间。

ANT

使用ant我尝试了以下设置(尝试在互联网上找到各种建议):

<target name="test">
    <schemavalidate warn="true" failonerror="true" fullchecking="true">
        <fileset dir="src/test/xml">
            <include name="ASN_207a44e3-0aeb6cd8-551ffcc2-2ca1409a.xml" />
        </fileset>
        <xmlcatalog>
            <classpath>
                <pathelement location="resolver.jar" />
                <pathelement location="ant-apache-resolver-1.8.4.jar" />
            </classpath>
            <xmlcatalog>
                <catalogpath>
                    <pathelement location="target/classes/MTC/catalog.xml" />
                </catalogpath>
            </xmlcatalog>
        </xmlcatalog>
    </schemavalidate>
</target>

在这种情况下,我没有得到解析目录文件的迹象。我只得到意外元素的错误。当我更改ant脚本以直接使用它可以使用的模式文件时,但这不是我想要的设置。

1 个答案:

答案 0 :(得分:0)

我最终在maven项目中为每个XSD创建了一个validationSet,并在单独的文件夹中对要测试的文件进行了创建。

<validationSet>
  <dir>src/test/xml/foo</dir>
  <validating>true</validating>
  <systemId>http://example.org/schema/foo.xsd</systemId>
</validationSet>
<validationSet>
  <dir>src/test/xml/bar</dir>
  <validating>true</validating>
  <systemId>http://example.org/schema/bar.xsd</systemId>
</validationSet>

显然可以正确读取第二个catalog.xml。