SAXParseException; src-resolve:无法将名称“...”解析为(n)“类型定义”组件
Posted
技术标签:
【中文标题】SAXParseException; src-resolve:无法将名称“...”解析为(n)“类型定义”组件【英文标题】:SAXParseException; src-resolve: Cannot resolve the name '...' to a(n) 'type definition' component 【发布时间】:2013-09-22 03:07:27 【问题描述】:我正在尝试进行架构验证,目前使用的是javax.xml.validation.SchemaFactory
。不幸的是,当我调用newSchema(Source schema)
函数时,出现以下错误:
Caused by: org.xml.sax.SAXParseException; systemId: file:/C:/Users/C42056/Documents/workspace-sts-3.2.0.RELEASE/cec-sample-ws-integration-2-war/target/classes/WEB-INF/schemas/xsd/individual/PrivateComponentTypes_4_0.xsd; lineNumber: 33; columnNumber: 88; src-resolve: Cannot resolve the name 'utility:ObjectStatusDateType' to a(n) 'type definition' component.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.traversers.XSDHandler.reportSchemaError(Unknown Source)
at org.apache.xerces.impl.xs.traversers.XSDHandler.reportSchemaError(Unknown Source)
at org.apache.xerces.impl.xs.traversers.XSDHandler.getGlobalDecl(Unknown Source)
at org.apache.xerces.impl.xs.traversers.XSDElementTraverser.traverseNamedElement(Unknown Source)
at org.apache.xerces.impl.xs.traversers.XSDElementTraverser.traverseLocal(Unknown Source)
at org.apache.xerces.impl.xs.traversers.XSDHandler.traverseLocalElements(Unknown Source)
at org.apache.xerces.impl.xs.traversers.XSDHandler.parseSchema(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaLoader.loadSchema(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source)
at org.apache.xerces.jaxp.validation.XMLSchemaFactory.newSchema(Unknown Source)
at com.sei.ec.xml.validation.SimpleXmlValidator.loadSchema(SimpleXmlValidator.java:70)
at com.sei.ec.xml.validation.SimpleXmlValidator.<init>(SimpleXmlValidator.java:83)
... 75 more
utility:ObjectStatusDateType
元素在我传递给newSchema(Source schema)
函数的.xsd 文件中使用。我正在从另一个 .xsd 文件导入ObjectStatusDateType
,为此我已经三次检查了文件路径。 utility
命名空间也被正确声明。
这是我传递给函数的架构的 sn-p (LocateCoverageIndexesByIdentifier_3_0.xsd):
<xs:import namespace="http://www.sei.com/utility/1/" schemaLocation="../../utility/InvocationOutcome_1_0.xsd"/>
<xs:import namespace="http://www.sei.com/utility/1/" schemaLocation="../../utility/ObjectHistory_1_0.xsd"/>
<xs:import namespace="http://www.sei.com/individual/component/4/" schemaLocation="../PrivateComponentTypes_4_0.xsd"/>
<xs:import namespace="http://www.sei.com/individual/shared/5/" schemaLocation="../IndividualTypes_5_0.xsd"/>
.
. <!-- Some more stuff -->
.
<xs:element name="coveragePeriod"
type="utility:ObjectStatusDateType"
minOccurs="0"/>
这是来自 ObjectHistory_1_0.xsd:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.sei.com/utility/1/"
targetNamespace="http://www.sei.com/utility/1/"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
version="1.0">
.
. <!-- Some more stuff -->
.
<xs:complexType name="ObjectStatusDateType">
<xs:sequence>
<xs:element name="effectiveDate" type="xs:date"/>
<xs:element name="cancelDate" type="xs:date" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
最后是豆子
<bean id="locateClaimValidator"
class="com.sei.ec.xml.validation.SimpleXmlValidator">
<constructor-arg>
<value>classpath:WEB-INF/schemas/xsd/individual/ci/LocateCoverageIndexesByIdentifier_3_0.xsd
</value>
</constructor-arg>
</bean>
以前有人遇到过这类问题吗?
【问题讨论】:
【参考方案1】:我以前遇到过这个问题。一切都在 Eclipse 中验证,但在运行时中断。您的任何架构是否将多个架构导入同一个命名空间?
这样的东西不会起作用,但会被 Eclipse 验证:
<import namespace="http://www.whatever.gov" location="../wherever" />
<import namespace="http://www.whatever.gov" location="../folder/superawesomeschema.xsd" />
【讨论】:
这解决了它。抱歉,我最初应该在我的第一个代码标签中包含更多文件(进行了编辑)。我在sei.com/utility/1 命名空间下包含了两个xsd 文件,其中一个是ObjectHistory_1_0.xsd。这总是愚蠢的东西...... 抱歉,当包含另一个命名空间时无法验证? 将属性“location”替换为“schemaLocation”(参见w3schools.com/xml/el_import.asp)【参考方案2】:很多人以前都遇到过此类问题。每当您的验证器出于某种原因未加载您希望它加载的架构文档时(并认为它正在加载),它就会出现。
要确认诊断:尝试在 ObjectHistory_1_0.xsd 中引入一个错误(例如,格式正确的错误),然后查看系统是否有问题。
【讨论】:
你是对的.. 如果我更改 ObjectHistory_1_0.xsd 的某些内容,工厂不会处理问题【参考方案3】:使用 Xerces 可以通过设置特性来解决这个问题
http://apache.org/xml/features/honour-all-schemaLocations
为真。
功能http://apache.org/xml/features/honour-all-schemaLocations
仅可用
来自 Xerces 2.7.0。 Java 5.0 和 6.0 的当前版本具有 Xerces 2.6.2
内置。因此,必须使用更新的 Xerces 库才能使其正常工作,
IE。将 xml-apis.jar
和 xercesImpl.jar
复制到 <jdk-home>/jre/lib/endorsed
和
在包含该行的<jdk-home>/jre
中创建一个jaxp.properties
文件
javax.xml.validation.SchemaFactory\:http\://www.w3.org/2001/XMLSchema=org.apache.xerces.jaxp.validation.XMLSchemaFactory
【讨论】:
【参考方案4】:我在执行 maven 插件 jaxb2-maven-plugin 时遇到了同样的问题。 在明确提到要解析的 xsd 文件之后,它就像一个魅力:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaFiles>MySchema.xsd</schemaFiles>
<outputDirectory>src/main/java</outputDirectory>
</configuration>
</plugin>
【讨论】:
这对我也有帮助 - 明确指向一个xsd
文件(同一目录中有多个 xsd
文件)。以上是关于SAXParseException; src-resolve:无法将名称“...”解析为(n)“类型定义”组件的主要内容,如果未能解决你的问题,请参考以下文章
如何解决 Jenkins 中的 SAXParseException?
SAXParseException:找不到元素“定义”的声明
SAXParseException:找不到元素“定义”的声明
org.xml.sax.SAXParseException:prolog 中不允许内容