ant中的XML验证失败,错误与要验证的文件不匹配

时间:2013-11-14 20:00:30

标签: xml validation ant saxon xerces

提前感谢您的帮助......

我遇到了对DTD验证失败的XML文件的问题(通过ant xmlvalidate任务),但XML文档中报告的错误与正在验证的文档的内容不匹配。此外,在Oxygen中打开的相同文件验证没有问题。

报告错误的ant输出示例如下:

[xmlvalidate] /Path/to/file.xml:240:91: Attribute "match_style" with value "ble" must have a value from the list "any all none ".

在对相关文件进行目视检查时,第240行的match_style属性值为all。搜索文件会显示字符串ble,但它确实在文档中出现多次(作为标记中table的子字符串,以及enable作为属性名称的子字符串) ,在第145和328行之间根本没有出现。

我尝试过手动编辑XML文件并重新验证。如果我从文件前面删除换行符或其他空格(有时候我添加换行符)而不是报告的错误(不进行其他更改),它偶尔会完全解决问题,然后文件将验证。在其他情况下,它仍然失败,但错误是在文件的下方,并且对更接近新错误的空格的额外编辑将修复事情或者进一步向下移动“错误”。我无法辨别任何押韵或理由,这些编辑将修复什么,哪些不会。

重复一点:有时更改空白并且不做其他更改会导致文件验证。

我已经在XML文件中查找了可能会做奇怪事情的隐形和控制字符,但除了花园种类空白之外没有找到任何其他内容,所有这些都应该是。

这些文件是通过XSLT 2.0转换从各种其他XML版本的源文件生成的。转换是通过使用Saxon的Java任务在ant构建中完成的。 (我无法使XSLT任务或Saxon任务按预期工作,因为我的XSL在某些情况下会从单个源文件生成多个结果文档,除了第一个结果之外的所有文档都会生成多个结果文档对于那些任务,doc似乎总是被省略。)这是任务:

<java classname="net.sf.saxon.Transform" fork="true"
    output="${dest.dir}/build"
    resultproperty="transform_result"
    failonerror="true">
    <arg line="-o ${dest.dir}/ ${source.dir}/xml_sources ${source.dir}/xsl/transform.xsl"/>
</java>

我还搜索了XSL和源XML文件以寻找不寻常的字符,并在XSL中使用字符映射并在结果文档中缩进以确保没有奇怪的空白字符。没有发现任何奇怪的东西,而且角色映射或缩进制作的唯一差异与手动编辑空白基本相同 - “错误”有时会移动,但仍然会发生。

我尝试过使用不同版本的Saxon和不同版本的Ant,没有不同的结果。问题开始了一段时间(不完全确定何时),但一切都曾经使用过一次,所以我尝试使用旧版本的XSL和源代码,但没有发现旧版本的东西没有显示问题(虽然由于从CVS切换到SVN,并且CVS不再存在,我可能根本无法回到足够远,因为现在丢失了一些最旧的修订版)。

文件必须验证的DTD不是我的 - 我无法更改它或切换到架构。

我通常在Mac上运行(目前运行10.7.5),但问题也发生在Linux上(不知道是什么版本)。我真的无法使用的一个变量是Java。当事情上次正常工作时,我可能已经运行了Java 1.5 - 我现在使用的是1.7,它确实发生在我运行1.6时。我不能在我有的机器上回到1.5。

这是我能想到的所有可能相关的信息。

我在这个问题上的斗智尽头。在我的所有研究中,我从未听说过其他人报告同样的问题,更不用说解决它了。任何关于可能出错的想法都会受到极大的赞赏。

谢谢!

1 个答案:

答案 0 :(得分:2)

我怀疑是JDK附带的Xerces解析器,它是错误的。尝试使用Apache的Xerces版本,这要好得多。

(我这样说是因为我之前看到过Xerces misreport属性值的JDK版本,其中包含文档中存在的字符串,但不是属性值。)