我使用lxml:
运行此验证parser = etree.XMLParser()
try:
root = etree.fromstring(xml_content.strip(), parser)
except Exception as e:
raise XMLFormatException(str(e), XMLFormatException.IN_XML)
try:
schema = etree.XMLSchema(etree.XML(xsd_content.strip()))
except Exception as e:
raise XMLFormatException(str(e), XMLFormatException.IN_XSD)
if not schema.validate():
raise XMLValidationException("Se produjo un error al validar el XML", schema.error_log)
假设xml_content
和xsd_content
已正确实例化。部分xsd内容是:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#" elementFormDefault="qualified">
<xsd:import namespace="http://www.w3.org/2000/09/xmldsig#"
schemaLocation="xmldsig-core-schema.xsd" />
<!-- more stuff here -->
</xsd:schema>
当我运行脚本时出现错误:
无法加载外部实体&#34; xmldsig-core-schema.xsd&#34;
当我在浏览器中点击http://www.w3.org/2000/09/xmldsig#时,我会收到xsd内容。
问:我在这里缺少什么?我该如何避免这种错误?
修改备注:
答案 0 :(得分:2)
确保您在导入XSD的同一目录中拥有xmldsig-core-schema.xsd的副本。
如果您希望将导入的XSD放在文件系统的其他位置,则可以在URI表示法中使用绝对路径。例如,在Windows上:
<xsd:import namespace="http://www.w3.org/2000/09/xmldsig#"
schemaLocation="file:///c:/path/to/your/xsd/xmldsig-core-schema.xsd" />
或者改变这个:
<xsd:import namespace="http://www.w3.org/2000/09/xmldsig#"
schemaLocation="xmldsig-core-schema.xsd" />
到此:
<xsd:import namespace="http://www.w3.org/2000/09/xmldsig#"
schemaLocation="http://www.w3.org/2000/09/xmldsig" />
访问您已验证的远程副本位于该端点。