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 处理(这在这里真的没用).
我是 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 处理(这在这里真的没用).