如何修复lxml中的XSD导入错误?

时间:2014-12-19 17:36:59

标签: python xsd lxml

我使用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_contentxsd_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内容。

:我在这里缺少什么?我该如何避免这种错误?

修改备注:

  1. 在进行验证之前发生此错误(即在XMLSchema构造函数中发生此错误)。
  2. xsd文件由外部来源提供,我不允许对其进行编辑。

1 个答案:

答案 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" />

访问您已验证的远程副本位于该端点。