Java xsd未在某些系统上验证:“;无法将名称解析为(n)';类型定义';组件。”;
我对xsd非常陌生,目前我使用的xsd只在一些机器上进行验证。它在我的本地机器上工作,但当我在有代理或防火墙的机器上尝试这样做时,它就不再工作了。不过,我使用的模式是在本地使用的 以下是xsd模式尝试验证时出现的错误: src resolve:无法将名称“xenc:EncryptedDataType”解析为(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
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>