文件路径中的特殊字符导致XML XSD验证失败

时间:2014-09-12 15:11:37

标签: java xml xsd xsd-validation

我在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中,它也可以工作。

仅在我的环境中发生这种情况。它在我团队中的其他人的环境中运作良好。

有没有人有这样的问题?

2 个答案:

答案 0 :(得分:3)

重现问题

我可以确认您报告的在Windows 7下运行Xerces-J v2.11.0的行为。

我已将您的代码改编为问题的完整示例,包括以下特定更改:

  1. XML文档的使用 xsi:schemaLocation="http://www.teste.com/abc example.xsd"暗示 关于主要XSD的位置。
  2. XSD的主要声明xmlns:abc="http://www.teste.com/abc" 并使用abc前缀来引用类型 complexExample abc:CplExmpl。{/ li>

    XML文档:

    <?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>
    

    主XSD(example.xsd):

    <?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>
    

    包含XSD(layoutBase.xsd):

    <?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表示法的绝对路径解决此问题:

    1. 使用file:///D:/path/to/file.xml验证XML文档。
    2. 使用指定主XSD的位置 xsi:schemaLocation="http://www.teste.com/abc file:///D:/path/to/file/example.xsd"
    3. 使用<xs:include schemaLocation="file:///D:/path/to/file/layoutBase.xsd"/>指定所包含XSD的位置。
    4. 进行这些更改将允许针对XSD验证XML文档,即使路径中存在特殊字符也是如此。

答案 1 :(得分:0)

在项目的属性中打开“资源”选项卡,然后选择“文本文件编码”为UTF-8。