2013-07-23 7 views
17

के खिलाफ फ़ीड सत्यापन सत्यापन मेरे पास एक एक्सएमएल फ़ाइल है और मेरे पास एक्सएमएल स्कीमा है। मैं उस स्कीमा के खिलाफ फ़ाइल को सत्यापित करना चाहता हूं और जांच करता हूं कि यह उसका पालन करता है या नहीं। मैं पाइथन का उपयोग कर रहा हूं लेकिन उस मामले के लिए किसी भी भाषा के लिए खुला हूं अगर पाइथन में ऐसी कोई उपयोगी लाइब्रेरी नहीं है।एक्सएमएल (.xsd) स्कीमा

यहां मेरे सर्वोत्तम विकल्प क्या होंगे? मैं इस बारे में चिंता करता हूं कि मैं इसे कितनी तेजी से प्राप्त कर सकता हूं और दौड़ रहा हूं।

उत्तर

21

निश्चित रूप से lxml

एक पूर्वनिर्धारित स्कीमा के साथ एक XMLParser को परिभाषित करें, फ़ाइल fromstring() लोड और किसी भी XML स्कीमा त्रुटियां पकड़:

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

यह काम करता है, हाँ। क्या इस पर एक संक्षिप्त ट्यूटोरियल है? मैंने स्कीमा और फीड फाइल पास की और यह दोनों को लिया और उन्हें संसाधित किया। मुझे कैसे पता चलेगा कि यह मान्य हो गया है या नहीं? – Scooby

+0

यह आसान है। यदि xml फ़ाइल मान्य नहीं है तो 'etree.fromstring' अपवाद फेंक देगा। – alecxe

+0

वाह, वह जल्दी था। अब बात यह है कि मैं कई एक्सएमएल फ़ीड पढ़ना चाहता हूं और स्कीमा के खिलाफ उन्हें मान्य करना चाहता हूं। तो मैं उन्हें बस से बाहर लूप कर सकता था? 1. अपवाद पर यह केवल प्रसंस्करण बंद कर देगा और अन्य फ़ीड को अनदेखा कर देगा? मैं सभी फीड फाइलों को संसाधित करना चाहता हूं और फिर यदि संभव हो तो यह त्रुटि दें कि यह कहां विफल हुआ या मान्य नहीं हुआ। 2. इसके अलावा, फ़ीड में कई रिकॉर्ड हो सकते हैं, क्या उनमें से सभी को चलाने और सत्यापन को विफल करने या विफल करने के आधार पर उन्हें विभाजित करने का कोई तरीका है। – Scooby

1

अजगर टुकड़ा अच्छा है, लेकिन एक विकल्प के xmllint उपयोग करने के लिए है:

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

बस यह एक ही मुद्दा गुगल रहा है - मुझे यह एक और एक्सएमएल लाइब्रेरी स्थापित करने पर पसंद है (मैं XML उत्पन्न करने के लिए अंतर्निहित xml.etree मॉड्यूल का उपयोग कर रहा हूं)। – nrlakin

संबंधित मुद्दे