【问题标题】:XML Validation in ant failing with errors that don't match the files being validatedant 中的 XML 验证失败,错误与正在验证的文件不匹配
【发布时间】:2013-11-14 20:00:30
【问题描述】:

提前感谢您的帮助...

我遇到了一个问题,XML 文件未能通过 DTD 验证(通过 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 风格的源文件生成的。转换是通过 Java 任务使用 Saxon 在 ant 构建中完成的。 (我无法让 XSLT 任务或 Saxon 任务按需要工作,因为我的 XSL 在某些情况下会从单个源文件生成多个结果文档,并且除了第一个结果文档之外的所有文档似乎总是在这些任务中省略。)这是任务:

<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 和源代码,但没有找到旧版本的东西' t 显示问题(尽管由于从 CVS 切换到 SVN,并且 CVS 不再存在,我可能根本无法回到足够远的地方,因为一些最旧的修订现在丢失了)。

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

我通常在 Mac 上工作(当前运行 10.7.5),但问题也发生在 Linux 上(不确定是什么版本)。我真正无法使用的一个变量是Java。上次运行正常时,我可能一直在运行 Java 1.5——我现在使用的是 1.7,而且当我运行 1.6 时肯定会发生这种情况。我无法在可用的机器上回到 1.5。

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

我对这个问题束手无策。在我所有的研究中,我从来没有听说过其他人报告过同样的问题,更不用说解决它了。任何关于可能出错的想法都将不胜感激。

谢谢!

【问题讨论】:

  • 嗯...这可能是某种竞争条件吗?我已经很多年没有和ant 合作过了。是否有可能——出于测试的目的——完全序列化 ant 作业的执行?另外,上面的fork="true" 会不会有什么影响?你能把它设置为"false"(在这个目标,当然还有所有其他目标)?
  • 任务相互依赖,因此转换在验证开始之前就完全完成了。我尝试在构建中将fork="true" 的所有实例更改为fork="false",但似乎没有任何改变。
  • 我还应该提到错误不仅仅是属性值 - 还有很多与元素内容有关,但是错误消息当然没有提到元素包含的内容,只是他们应该做什么。但是,基本上相同的事情发生了 - 有问题的行号上元素的实际内容是正确的,并且删除空格偶尔会导致文件验证或“错误”进一步向下移动文件。跨度>
  • DTD 是从类路径中获取的吗?该类路径在工作和非工作配置中是否一致?
  • 来自单个 Java 任务批次转换的文件(在某些情况下,从同一个源文件生成)将有一些验证,而另一些则没有。在任何情况下,DTD 都不在类路径上 - 它是根据每个文件的 DOCTYPE 中的内容进行的,并且有几个 DTD 会发生这种情况。

标签: xml validation ant saxon xerces


【解决方案1】:

我怀疑是 JDK 附带的 Xerces 解析器,它有问题。试试 Apache 的 Xerces 版本,会好很多。

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

【讨论】:

  • 这确实是问题所在 - 非常感谢SO!我对可能遇到此问题的其他人所做的详细信息:我下载了 Apache Xerces(版本 2.11.0)并将其添加到我项目中的适当位置,然后将 classname="org.apache.xerces.parsers.SAXParser"classpath="path/to/xercesImpl.jar 添加到我所有的 @987654323 @ ant 构建脚本中的任务。当它尝试运行xmlvalidate 任务时,最初会导致java.lang.OutOfMemoryError: PermGen space
  • 快速搜索后,我设置了ANT_OPTS=-Xmx1024m -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:MaxPermSize=512m,这样就成功了。构建现在完美运行,我的有效文件实际上再次验证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 2019-06-29
  • 2019-06-23
相关资源
最近更新 更多