xsd 未在某些系统上验证:"Cannot resolve the name to a(n) 'type definition' component."

xsd not validating on some systems: "Cannot resolve the name to a(n) 'type definition' component."

我是 xsds 的新手,目前我使用的 xsd 仅在 一些机器上验证。 它适用于我的本地机器,但是当我尝试在有代理或防火墙的机器上执行此操作时,它不再有效。不过,我使用的模式是在本地使用的。

这是 xsd 架构尝试验证时出现的错误:

src-resolve: Cannot resolve the name 'xenc:EncryptedDataType' to a(n) 'type definition' component.

来自这段代码:

boolean validate(URL schemaUrl) {
        SchemaFactory schemaFactory = SchemaFactory
                .newInstance("http://www.w3.org/2001/XMLSchema");
        Schema schema = null;
        try {
            schema = schemaFactory.newSchema(schemaUrl); //this is where the exception is thrown
        } catch (SAXException e) {
            //exception is caught here
            return false;
        }
        //... more code here
}

该错误与此错误具有相同的堆栈跟踪: SAXParseException; src-resolve: Cannot resolve the name '...' to a(n) 'type definition' component

我的 main xsd 的开头是这样的:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
           xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
           xmlns:tns="http://customization.elster.com/shipment"
           targetNamespace="http://customization.client.com/introduction"
           attributeFormDefault="unqualified"
           elementFormDefault="qualified"
           version="1.1" >
    <xs:import namespace="http://www.w3.org/2001/04/xmlenc#" schemaLocation="xenc-schema.xsd"/>
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd"/>

在这个主要的 XML 我需要 "xenc:EncryptedDataType"

<xs:complexType name="NamedEncryptedDataType">
        <xs:complexContent>
            <xs:extension base="xenc:EncryptedDataType">
                <xs:attribute name="name" type="xs:string" use="required"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

xenc-schema.xsd 中定义(与我的主 xsd 在同一文件夹中)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE schema  PUBLIC "-//W3C//DTD XMLSchema 200102//EN"
 "http://www.w3.org/2001/XMLSchema.dtd"
 [
<!ATTLIST schema
     xmlns:xenc CDATA #FIXED 'http://www.w3.org/2001/04/xmlenc#'
     xmlns:ds CDATA #FIXED 'http://www.w3.org/2000/09/xmldsig#'>
   <!ENTITY xenc 'http://www.w3.org/2001/04/xmlenc#'>
   <!ENTITY % p ''>
   <!ENTITY % s ''>
  ]>

<schema xmlns='http://www.w3.org/2001/XMLSchema' version='1.0'
        xmlns:xenc='http://www.w3.org/2001/04/xmlenc#'
        xmlns:ds='http://www.w3.org/2000/09/xmldsig#'
        targetNamespace='http://www.w3.org/2001/04/xmlenc#'
        elementFormDefault='qualified'>

  <import namespace='http://www.w3.org/2000/09/xmldsig#'
          schemaLocation='xmldsig-core-schema.xsd'/>

在此 xenc 架构中,存在罪魁祸首数据类型:

  <element name='EncryptedData' type='xenc:EncryptedDataType'/>
  <complexType name='EncryptedDataType'>
    <complexContent>
      <extension base='xenc:EncryptedType'>
       </extension>
    </complexContent>
  </complexType>

我尽量缩短这个问题,如果需要更多信息,请告诉我,感谢阅读。

诊断此类问题的最佳方法是安装 HTTP 调试器。例如,Fiddler 是一个适合您的好方法。它应该会告诉您哪些资源是在外部(在 Internet 上)解析的。

对于您的情况,罪魁祸首很可能是 xenc-schema.xsd 文件中的 DTD。要快速证明这一点,只需删除任何嵌入式 DTD。一旦你证明了这个问题,你可以选择简单地保留编辑过的 XSD,或者使用自定义的 EntityResolver,或者看看你的特定库是否有某种 属性 你可以设置禁用 DTD 处理(这在这里真的没用).