2013-07-23 22 views
17

XML dosyanız var ve bir XML şeması var. Dosyayı bu şemaya göre doğrulamak ve buna uyup uymadığını kontrol etmek istiyorum. Python kullanıyorum ama python'da böyle kullanışlı bir kütüphane yoksa, herhangi bir dile açıkım.XML (.xsd) şemaya göre feed onayı

En iyi seçeneklerim burada ne olurdu? Bunu nasıl başarabileceğimi ve koşabildiğim için endişelenirim.

cevap

21

Kesinlikle lxml.

dosyayı fromstring() yüklemek, önceden tanımlanmış bir şemaya sahip bir XMLParser tanımlamak ve herhangi bir XML şeması hataları yakalamak:

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

Çalışıyor, evet. Üzerinde kısa bir eğitim var mı? Şema ve feed dosyasını geçtim ve her ikisini de aldım ve işledim. Doğrulanmış olup olmadığını nasıl anlarım? – Scooby

+0

Bu basit. xml dosyası doğrulanmazsa etree.fromstring' bir istisna atar. – alecxe

+0

Vay, bu hızlıydı. Şimdi ise, birden fazla xml beslemesi okumak ve bunları şemaya göre doğrulamak istiyorum. Bu yüzden onları sadece diziden geçirebilirim? 1. Bir istisna dışında, yalnızca diğer beslemelerin işlenmesini ve yok sayılmasını engeller miydi? Tüm yayın dosyalarını işlemek ve mümkün olduğunda nerede başarısız olduğunu veya doğrulanmadığını bildirmek istiyorum. 2. Ayrıca, bu bir çok kayda sahip olabilir, hepsini çalıştırmak için herhangi bir yol var mı ve geçerliliği geçme veya başarısızlığa dayalı olarak bölme. – Scooby

1

piton pasajı iyidir, ama alternatif xmllint komutunu kullanmaktır:

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

Sadece bu sorunu gözden geçirirken buldum - Başka bir XML kütüphanesi kurmayı seviyorum (XML oluşturmak için yerleşik xml.etree modülünü kullanıyorum). – nrlakin