我在S.O.读到了很多问题。关于这个错误,但似乎没有我遇到的问题。
在Eclipse中,我的项目通过以下路径导入:
D:\Repositório\ branch 7.x.x dev \ project-commons
example.xsd位于文件夹\src\main\resources\schemas\
中,并包含一个包含其他XSD的标记,如:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.teste.com/abc" targetNamespace="http://www.teste.com/abc" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:include schemaLocation="layoutBase.xsd"/>
<xs:element name="complexExample" type="CplExmpl">
<xs:annotation>
<xs:documentation> Process...</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>
{Boolean {名称}在。layoutBase.xsd中定义。
layoutBase.xsd位于example.xsd。
的同一文件夹中CplExmpl
但是,当我运行我的服务并通过example.xsd进行验证时,它不起作用。
这是stacktrace:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.teste.com/abc" targetNamespace="http://www.teste.com/abc" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="CplExmpl">
<xs:annotation>
<xs:documentation> Process...</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element .../>
<xs:element .../>
</xs:sequence>
<xs:attribute name="version" .../>
</xs:complexType>
</xs:schema>
之后,我在另一个目录中运行了这项服务的测试。它的工作原理。
似乎错误是由D:\Repositório中的特殊字符“ó”引起的。
找不到Caused by: org.xml.sax.SAXParseException; systemId: file:/D:/Repositório/branch 7.x.x dev/project-commons/target/classes/schemas/example.xsd;
lineNumber: 4; columnNumber: 45; src-resolve: Cannot resolve the name 'CplExmpl' 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.traverseGlobal(Unknown Source)
at org.apache.xerces.impl.xs.traversers.XSDHandler.traverseSchemas(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 javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:627)
at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:659)
at br.com.oobj.util.xml.JAXPValidate$ValidatorKeyedPoolFactoryAdapter.getSchema(JAXPValidate.java:523)
at br.com.oobj.util.xml.JAXPValidate$ValidatorKeyedPoolFactoryAdapter.makeObject(JAXPValidate.java:509)
at org.apache.commons.pool.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:1212)
at br.com.oobj.util.xml.JAXPValidate.borrowValidator(JAXPValidate.java:212)
... 12 more
。
我测试将complexType放在example.xsd中,它也可以工作。
仅在我的环境中发生这种情况。它在我团队中的其他人的环境中运作良好。
有没有人有这样的问题?
答案 0 :(得分:3)
我可以确认您报告的在Windows 7下运行Xerces-J v2.11.0的行为。
我已将您的代码改编为问题的完整示例,包括以下特定更改:
xsi:schemaLocation="http://www.teste.com/abc example.xsd"
暗示
关于主要XSD的位置。xmlns:abc="http://www.teste.com/abc"
并使用abc
前缀来引用类型
complexExample
abc:CplExmpl
。{/ li>
醇>
<?xml version="1.1" encoding="UTF-8"?>
<complexExample xmlns="http://www.teste.com/abc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.teste.com/abc example.xsd"
version="1">
<a/>
<b/>
</complexExample>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:abc="http://www.teste.com/abc"
targetNamespace="http://www.teste.com/abc"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:include schemaLocation="layoutBase.xsd"/>
<xs:element name="complexExample" type="abc:CplExmpl">
<xs:annotation>
<xs:documentation> Process...</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:abc="http://www.teste.com/abc"
targetNamespace="http://www.teste.com/abc"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:complexType name="CplExmpl">
<xs:annotation>
<xs:documentation> Process...</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="a"/>
<xs:element name="b"/>
</xs:sequence>
<xs:attribute name="version"/>
</xs:complexType>
</xs:schema>
这三个文档一起是正确的,并且允许成功验证示例XML,在包含这些文件的路径中不存在特殊字符。
如果我在包含这些文件的路径中添加“ó”字符,即使只使用相对路径,解析器也无法再找到文件。
The Java URI That Isn't建议描述Java java.net.URI类处理路径名中特殊字符的弱点。 Xerces-J可能会被这些问题所困扰。
为所有文件指定使用完整URI表示法的绝对路径解决此问题:
file:///D:/path/to/file.xml
验证XML文档。xsi:schemaLocation="http://www.teste.com/abc
file:///D:/path/to/file/example.xsd"
<xs:include
schemaLocation="file:///D:/path/to/file/layoutBase.xsd"/>
指定所包含XSD的位置。进行这些更改将允许针对XSD验证XML文档,即使路径中存在特殊字符也是如此。
答案 1 :(得分:0)
在项目的属性中打开“资源”选项卡,然后选择“文本文件编码”为UTF-8。