0

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

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

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

我尝试了以下设置:

马文

  <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。基础 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 不会将通过目录加载的模式与验证器链接起来。使用 -XI 确实可以看到它处理目录并查看模式及其名称空间。

蚂蚁

使用 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 脚本更改为直接使用架构文件时,它可以工作,但这不是我想要的设置。

4

1 回答 1

0

最后,我在 maven 项目中为每个 XSD 创建了一个验证集,并将要测试的文件放在单独的文件夹中。

<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 显然已正确读取。

于 2013-01-14T10:56:30.223 回答