Java xsd未在某些系统上验证:“;无法将名称解析为(n)';类型定义';组件。”;

Java xsd未在某些系统上验证:“;无法将名称解析为(n)';类型定义';组件。”;,java,xml,xsd,xsd-validation,Java,Xml,Xsd,Xsd Validation,我对xsd非常陌生,目前我使用的xsd只在一些机器上进行验证。它在我的本地机器上工作,但当我在有代理或防火墙的机器上尝试这样做时,它就不再工作了。不过,我使用的模式是在本地使用的 以下是xsd模式尝试验证时出现的错误: src resolve:无法将名称“xenc:EncryptedDataType”解析为(n) “类型定义”组件 它来自以下代码: boolean validate(URL schemaUrl) { SchemaFactory schemaFactory = Sc

我对xsd非常陌生,目前我使用的xsd只在一些机器上进行验证。它在我的本地机器上工作,但当我在有代理或防火墙的机器上尝试这样做时,它就不再工作了。不过,我使用的模式是在本地使用的

以下是xsd模式尝试验证时出现的错误:

src resolve:无法将名称“xenc:EncryptedDataType”解析为(n) “类型定义”组件

它来自以下代码:

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
}
该错误具有与此错误相同的堆栈跟踪:

我的主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”


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


]>
在此xenc模式中,存在罪魁祸首数据类型:

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


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

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


在您的情况下,罪魁祸首很可能是xenc-schema.xsd文件中的DTD。要快速证明这一点,只需去掉任何嵌入式DTD即可。一旦您证明了这个问题,您可以选择只保留已编辑的XSD,或者使用自定义EntityResolver,或者查看您的特定库是否具有某种可以设置为禁用DTD处理的属性(这在这里是非常无用的)

似乎用DTD完全删除doctype就成功了。谢谢你的建议。@VladIlie,我想我看到了之前的评论:没有看到任何外部交通。为了确保这一点,对于Java应用程序,您需要配置代理信息——这可能会很有帮助。
<?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'/>
  <element name='EncryptedData' type='xenc:EncryptedDataType'/>
  <complexType name='EncryptedDataType'>
    <complexContent>
      <extension base='xenc:EncryptedType'>
       </extension>
    </complexContent>
  </complexType>