2014-12-19 31 views
6

uruchomić ten potwierdzenia przy użyciu lxml:Jak mogę naprawić błąd importu XSD w 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) 

Przyjmij xml_content i xsd_content są prawidłowo instancję. Część zawartości xsd jest taka:

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

Kiedy uruchomić skrypt pojawia się błąd:

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

Kiedy uderzę http://www.w3.org/2000/09/xmldsig# w przeglądarce, otrzymuję treść xsd.

Q: Czego mi tu brakuje? Jak mogę uniknąć takiego błędu?

Edit Uwagi:

  1. Ten błąd występuje przed walidacji mogą być wykonane (tj Ten błąd występuje w konstruktorze XMLSchema).
  2. Plik xsd jest dostarczany z zewnętrznego źródła i nie wolno mi go edytować.

Odpowiedz

2

Upewnij się, że masz kopię pliku xmldsig-core-schema.xsd w tym samym katalogu, co importujący plik XSD.

Jeśli chcesz zlokalizować zaimportowany XSD w innym miejscu w systemie plików, możesz użyć bezwzględnych ścieżek w notacji URI. Na przykład, w systemie Windows:

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

lub zmieniać to:

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

do tego:

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

dostęp do zdalnego kopię, która zweryfikowaniu jest w tym punkcie końcowym.

+0

Nie mogę zmienić takiego pliku. Plik jest dostarczany przez lokalną organizację rządową. –

+0

Następnie upewnij się, że masz kopię xmldsig-core-schema.xsd w tym samym katalogu co importujący XSD. – kjhughes

+0

Biorę twoje rozwiązanie. Teraz mogę edytować plik. Powód błędu: chłopaki (@ rząd !!!), którzy skomponowali XML, zrobili to źle !!. Wziąłem twoje drugie rozwiązanie. –

Powiązane problemy