如何从 CLASSPATH 中引用 XSD 来验证我的 XML?

Posted

技术标签:

【中文标题】如何从 CLASSPATH 中引用 XSD 来验证我的 XML?【英文标题】:How can I reference an XSD off the CLASSPATH for validating my XML? 【发布时间】:2011-06-17 10:45:21 【问题描述】:

作为我的 XML 转换(使用 XSL)的一部分,我正在为模式位置创建一个属性,以便可以验证转换的结果。但是,当我尝试将其作为独立测试运行时,我希望能够为架构位置设置适当的属性/值,使其脱离我的 CLASSPATH。

经过一番谷歌搜索后,我尝试了各种 schemaLocation 属性,最新尝试是:

..
<xsl:attribute name="xsi:external-noNamespaceSchemaLocation">
  <xsl:value-of select="$schemaLocation"/>
</xsl:attribute>
..

转换后的结果是:

<?xml version="1.0" encoding="UTF-8"?>
<emrException 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:external-noNamespaceSchemaLocation="emrException_1_0.xsd">
    ..
    <!-- more well-formed XML -->
</emrException>

当验证器运行时,我仔细检查了我的 emrException_1_0.xsd 文件是否在 CLASSPATH 中。它是一个 DOM 验证器,我使用的是 Xerces 2.9.1/Xalan 2.7.1,我得到的结果是:

Caused by: org.xml.sax.SAXParseException: 
    cvc-elt.1: Cannot find the declaration of element 'emrException'.

但是,当我切换到使用从文件系统或外部 URL 读取 XSD 文件的架构位置时,验证器运行起来很有趣。

如何从我的 CLASSPATH 中读取 XSD?

【问题讨论】:

【参考方案1】:

一种方法是实现您自己的 LSResourceResolver 和 LSInput,这样传入的 systemId 就可以按照您的意愿进行解析。

【讨论】:

以上是关于如何从 CLASSPATH 中引用 XSD 来验证我的 XML?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SaxonJS 进行模式验证以获取缺失的引用

没有元素引用的XSD complexType有什么用?

如何验证XML架构中的命名约定

如何根据 XSD 模式验证 XML 结构的单个条目

导入 xml 文件并引用 xsd 文件

验证 XSD 架构?