2014-12-19 20 views
6

tôi chạy xác nhận này sử dụng lxml:Làm cách nào để khắc phục lỗi nhập XSD trong 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) 

Giả xml_contentxsd_content được khởi tạo một cách chính xác. Một phần của nội dung XSD là thế này:

<?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> 

Khi tôi chạy kịch bản tôi nhận được một lỗi:

failed to load external entity "xmldsig-core-schema.xsd"

Khi tôi nhấn http://www.w3.org/2000/09/xmldsig# trong trình duyệt, tôi nhận được một nội dung XSD.

Q: Tôi thiếu gì ở đây? Làm thế nào tôi có thể tránh được lỗi như vậy?

Sửa Ghi chú:

  1. Lỗi này xảy ra trước khi xác nhận có thể được thực hiện (ví dụ: lỗi này xảy ra trong các nhà xây dựng XMLSCHEMA).
  2. Tệp xsd được cung cấp từ nguồn bên ngoài và tôi không được phép chỉnh sửa nó.

Trả lời

2

Đảm bảo rằng bạn có bản sao xmldsig-core-schema.xsd trong cùng thư mục với nhập XSD.

Nếu bạn muốn định vị XSD đã nhập ở nơi khác trong hệ thống tệp của mình, bạn có thể sử dụng đường dẫn tuyệt đối trong ký pháp URI. Ví dụ, trên Windows:

<xsd:import namespace="http://www.w3.org/2000/09/xmldsig#" 
      schemaLocation="file:///c:/path/to/your/xsd/xmldsig-core-schema.xsd" /> 

Hoặc thay đổi này:

<xsd:import namespace="http://www.w3.org/2000/09/xmldsig#" 
      schemaLocation="xmldsig-core-schema.xsd" /> 

này:

<xsd:import namespace="http://www.w3.org/2000/09/xmldsig#" 
      schemaLocation="http://www.w3.org/2000/09/xmldsig" /> 

để truy cập sao chép từ xa, mà bạn đã xác minh là thiết bị đầu cuối đó.

+0

Tôi không thể thay đổi tệp đó. Tệp được cung cấp bởi một tổ chức chính quyền địa phương. –

+0

Sau đó, hãy đảm bảo rằng bạn có một bản sao của xmldsig-core-schema.xsd trong cùng thư mục với XSD nhập. – kjhughes

+0

Tôi lấy giải pháp của bạn. Ngay bây giờ tôi được phép chỉnh sửa tệp. Lý do của lỗi: Các chàng trai (@ chính phủ !!!), người sáng tác XML đã làm sai !! Tôi đã lấy giải pháp thứ hai của bạn. –

Các vấn đề liên quan