SAXParseException; src-resolve:无法将名称“...”解析为(n)“类型定义”组件

问题描述 投票:0回答:5

我正在尝试进行模式验证,当前使用

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
命名空间也已正确声明。

这是我传递到函数中的架构片段 (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>

有人遇到过此类问题吗?

java xml spring xsd xerces
5个回答
12
投票

我以前也遇到过这个问题。一切都在 Eclipse 中得到验证,但在运行时却崩溃了。您的任何模式是否将多个模式导入到同一命名空间中?

这样的东西不会起作用,但会被 Eclipse 验证:

<import namespace="http://www.whatever.gov" location="../wherever" />
<import namespace="http://www.whatever.gov" location="../folder/superawesomeschema.xsd" />

6
投票

很多人以前都遇到过此类问题。 每当您的验证器出于某种原因未加载您希望其加载的模式文档(并认为它正在加载)时,它就会出现。

要确认诊断:尝试在 ObjectHistory_1_0.xsd 中引入一个错误(例如,格式良好的错误),然后查看系统是否会抱怨。


5
投票

使用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
和 在
jaxp.properties
中创建一个
<jdk-home>/jre
文件,其中包含以下行

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> 

0
投票

如果您在 2024 年阅读本文,我就遇到了这个问题。 在我的例子中,问题的根源是 EOL 字符的不匹配或文件编码。

<xs:include schemaLocation="../../../path_to_xsd" />

在我的 xsd 文件中具有不同的 EOL 字符,我们的架构验证器没有捕获该问题。

© www.soinside.com 2019 - 2024. All rights reserved.