2013-07-23 23 views
17

Mam plik XML i mam schemat XML. Chcę sprawdzić plik pod kątem tego schematu i sprawdzić, czy jest on zgodny z tym schematem. Używam Pythona, ale jestem otwarty na dowolny język, jeśli nie ma takiej użytecznej biblioteki w Pythonie.Walidacja plików XML (.xsd) ze schematem

Jakie byłyby moje najlepsze opcje tutaj? Martwiłbym się, jak szybko mogę to wszystko uruchomić.

Odpowiedz

21

Zdecydowanie lxml.

Definiowanie XMLParser z ustalonym schematem, załaduj plik fromstring() i nadrobić ewentualne błędy XML Schema:

from lxml import etree 

def validate(xmlparser, xmlfilename): 
    try: 
     with open(xmlfilename, 'r') as f: 
      etree.fromstring(f.read(), xmlparser) 
     return True 
    except etree.XMLSchemaError: 
     return False 

with open(schema_file, 'r') as f: 
    schema_root = etree.XML(f.read()) 

schema = etree.XMLSchema(schema_root) 
xmlparser = etree.XMLParser(schema=schema) 

filenames = ['input1.xml', 'input2.xml', 'input3.xml'] 
for filename in filenames: 
    if validate(xmlparser, filename): 
     print "%s validates" % filename 
    else: 
     print "%s doesn't validate" % filename 
+0

To działa, tak. Czy jest tam krótki samouczek? Przekazałem schemat i plik danych, które zajęły oba i przetworzone. Skąd mam wiedzieć, czy został sprawdzony, czy nie? – Scooby

+0

To proste. 'etree.fromstring' rzuci wyjątek, jeśli plik XML nie zostanie sprawdzony. – alecxe

+0

Wow, to było szybkie. Teraz chodzi o to, że chciałbym przeczytać wiele plików xml i zweryfikować je w odniesieniu do schematu. Mogę po prostu zapętlić je przez ściągnięcie? 1. Czy z wyjątku przestałby on przetwarzać i ignorował inne źródła danych? Chciałbym przetworzyć wszystkie pliki danych, a następnie, jeśli to możliwe, podać błąd, jeśli nie udało się go zweryfikować. 2. Ponadto, plik danych może mieć wiele rekordów, czy istnieje sposób na ich uruchomienie i podzielenie na podstawie pozytywnej lub negatywnej weryfikacji. – Scooby

1

Pyton fragment jest dobry, ale alternatywą jest użycie xmllint:

xmllint -schema sample.xsd --noout sample.xml 
+0

Po prostu znalazłem to googlowanie w tym samym numerze - podoba mi się to przez zainstalowanie kolejnej biblioteki XML (Używam wbudowanego modułu xml.etree do generowania XML). – nrlakin