2013-07-23 13 views
17

Ho un file XML e ho uno schema XML. Voglio convalidare il file contro quello schema e controllare se si aderisce a quello. Sto usando Python, ma sono aperto a qualsiasi linguaggio se non c'è una tale libreria utile in Python.Convalida del feed XML (.xsd) su uno schema

Quali sarebbero le mie migliori opzioni qui? Mi preoccuperei di quanto velocemente riuscirò a farlo funzionare.

risposta

21

Definitivamente lxml.

Definire un XMLParser con uno schema predefinito, caricare il file fromstring() e rilevare eventuali errori 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

Funziona, sì. C'è un breve tutorial su di esso? Ho passato lo schema e il file del feed e ci sono voluti entrambi e li ho elaborati. Come potrei sapere se è stato convalidato o no? – Scooby

+0

È semplice. 'etree.fromstring' genererà un'eccezione se il file xml non viene convalidato. – alecxe

+0

wow, è stato veloce. Ora il fatto è che vorrei leggere più feed xml e validarli sullo schema. Quindi potrei semplicemente collegarli attraverso la stringa? 1. Su un'eccezione, basta interrompere l'elaborazione e ignorare altri feed? Vorrei elaborare tutti i file di feed e quindi, se possibile, dare un errore su dove ha fallito o non ha convalidato. 2. Inoltre, il feed può contenere molti record, esiste un modo per eseguirli tutti e dividerli in base al superamento o al fallimento della convalida. – Scooby

1

Il frammento di pitone è buona, ma in alternativa è quella di utilizzare xmllint:

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

Ho appena trovato questo googling lo stesso problema - Mi piace l'installazione di un'altra libreria XML (Sto usando il modulo built-in xml.etree per generare l'XML). – nrlakin