पायथन में एक XML स्कीमा के साथ मान्य


104

मेरे पास एक XML फ़ाइल और एक अन्य फ़ाइल में XML स्कीमा है और मैं यह सत्यापित करना चाहूंगा कि मेरी XML फ़ाइल स्कीमा का पालन करती है। मैं पायथन में यह कैसे करूँ?

मैं मानक पुस्तकालय का उपयोग करके कुछ पसंद करूंगा, लेकिन यदि आवश्यक हो तो मैं एक तृतीय-पक्ष पैकेज स्थापित कर सकता हूं।

जवाबों:


61

मैं मान रहा हूँ कि आप XSD फ़ाइलों का उपयोग कर रहे हैं। हैरानी की बात है कि कई अजगर एक्सएमएल लाइब्रेरी नहीं हैं जो इसका समर्थन करते हैं। हालांकि lxml करता है। Lxml के साथ सत्यापन की जाँच करें । पृष्ठ यह भी सूचीबद्ध करता है कि अन्य स्कीमा प्रकारों के साथ सत्यापन के लिए lxml का उपयोग कैसे करें।


1
lxml शुद्ध पायथन है या नहीं? (संकलन / स्थापना की आवश्यकता है या आप इसे अपने अजगर लिपियों के साथ शामिल कर सकते हैं)
सॉरिन

9
@ सोरीन: lxml, libxml2 C लाइब्रेरी के शीर्ष पर एक आवरण है, और इस प्रकार यह प्योर पाइथन नहीं है।
एली कोर्टराइट

2
@ मैं वास्तव में जिसे मैं रेखांकित करना चाहता था, यह किसी के लिए भी उचित नहीं हो सकता है।
सोरिन

1
सत्यापन त्रुटियां उपयोगकर्ता के अनुकूल नहीं हैं। मैं उसके बारे में कैसे जाऊंगा? mailman-mail5.webfaction.com/pipermail/lxml/2012-April/… मदद नहीं करता है।
कोई नहीं-दा

क्या यह उत्तर अभी तक अप-टू-डेट है?
मानव

27

"शुद्ध अजगर" समाधानों के लिए: पैकेज सूचकांक सूची:

  • pyxsd , वर्णन कहता है कि यह xml.etree.cElementTree का उपयोग करता है, जो "शुद्ध अजगर" नहीं है (लेकिन stdlib में शामिल है), लेकिन स्रोत कोड इंगित करता है कि यह वापस xml.etree.ElementTree पर आता है, इसलिए यह शुद्ध अजगर के रूप में गिना जाएगा। इसका उपयोग नहीं किया गया है, लेकिन डॉक्स के अनुसार, यह स्कीमा सत्यापन करता है।
  • minixsv : 'एक शुद्ध XML स्कीमा सत्यापनकर्ता "शुद्ध" पायथन' में लिखा गया है। हालाँकि, वर्णन कहता है "वर्तमान में XML स्कीमा मानक का एक सबसेट समर्थित है", इसलिए यह पर्याप्त नहीं हो सकता है।
  • XSV , जो मुझे लगता है कि W3C के ऑनलाइन xsd सत्यापनकर्ता के लिए उपयोग किया जाता है (यह अभी भी पुराने pyxml पैकेज का उपयोग करता है, जो मुझे लगता है कि अब नहीं रखा गया है)

5
मैं इन पर PyXB पर एक नज़र डालूंगा। ऐसा लगता है कि इनमें से अधिकांश राज्य अधूरे हैं, और वे कुछ हद तक "मृत" लगते हैं। pyxsd आखिरी बार 2006 में अपडेट हुआ, minixsv आखिरी बार 2008 में अपडेट हुआ, 2007 में XSV जहाँ तक मैं बता सकता हूँ। हमेशा एक पैकेज को दूसरे पर विचार करने का सबसे अच्छा कारण नहीं है, लेकिन मुझे लगता है कि यह इस मामले में उचित है।
oob

2
PyXB के लिए +1। मैं इसका इस्तेमाल Django में एडमिन सेक्शन में डाले गए रॉ XML को वेरिफाई करने के लिए कर रहा हूँ। उपयोग में सरल और आसान।
tatlar

21

Python3 में एक साधारण सत्यापनकर्ता का एक उदाहरण लोकप्रिय लाइब्रेरी का उपयोग कर lxml

स्थापना lxml

pip install lxml

यदि आपको कोई त्रुटि मिलती है जैसे "पुस्तकालय libxml2 में फ़ंक्शन xmlCheckVersion नहीं मिल सका है। क्या libxml2 स्थापित है?" , इसे पहले करने का प्रयास करें:

# Debian/Ubuntu
apt-get install python-dev python3-dev libxml2-dev libxslt-dev

# Fedora 23+
dnf install python-devel python3-devel libxml2-devel libxslt-devel

सबसे सरल सत्यापनकर्ता

चलो सरलतम सत्यापनकर्ता बनाएं

from lxml import etree

def validate(xml_path: str, xsd_path: str) -> bool:

    xmlschema_doc = etree.parse(xsd_path)
    xmlschema = etree.XMLSchema(xmlschema_doc)

    xml_doc = etree.parse(xml_path)
    result = xmlschema.validate(xml_doc)

    return result

उसके बाद मेनफ्रेम लिखें और चलाएं

from validator import validate

if validate("path/to/file.xml", "path/to/scheme.xsd"):
    print('Valid! :)')
else:
    print('Not valid! :(')

OOP का थोड़ा सा

एक से अधिक फ़ाइल को मान्य करने के लिए, हर बार XMLSchema ऑब्जेक्ट बनाने की आवश्यकता नहीं है , इसलिए:

validator.py

from lxml import etree

class Validator:

    def __init__(self, xsd_path: str):
        xmlschema_doc = etree.parse(xsd_path)
        self.xmlschema = etree.XMLSchema(xmlschema_doc)

    def validate(self, xml_path: str) -> bool:
        xml_doc = etree.parse(xml_path)
        result = self.xmlschema.validate(xml_doc)

        return result

अब हम निर्देशिका में सभी फाइलों को इस प्रकार मान्य कर सकते हैं:

main.py

import os
from validator import Validator

validator = Validator("path/to/scheme.xsd")

# The directory with XML files
XML_DIR = "path/to/directory"

for file_name in os.listdir(XML_DIR):
    print('{}: '.format(file_name), end='')

    file_path = '{}/{}'.format(XML_DIR, file_name)

    if validator.validate(file_path):
        print('Valid! :)')
    else:
        print('Not valid! :(')

अधिक विकल्पों के लिए यहां पढ़ें: एलएक्सएमएल के साथ सत्यापन


14

Http://pyxb.sourceforge.net/ पर PyXB पैकेज XML स्कीमा दस्तावेज़ों से पायथन के लिए मान्य बाइंडिंग उत्पन्न करता है। यह लगभग हर स्कीमा निर्माण को संभालता है और कई नामस्थानों का समर्थन करता है।


12

दो तरीके हैं (वास्तव में अधिक हैं) जो आप ऐसा कर सकते हैं।
1. lxml का उपयोग करना
pip install lxml

from lxml import etree, objectify
from lxml.etree import XMLSyntaxError

def xml_validator(some_xml_string, xsd_file='/path/to/my_schema_file.xsd'):
    try:
        schema = etree.XMLSchema(file=xsd_file)
        parser = objectify.makeparser(schema=schema)
        objectify.fromstring(some_xml_string, parser)
        print "YEAH!, my xml file has validated"
    except XMLSyntaxError:
        #handle exception here
        print "Oh NO!, my xml file does not validate"
        pass

xml_file = open('my_xml_file.xml', 'r')
xml_string = xml_file.read()
xml_file.close()

xml_validator(xml_string, '/path/to/my_schema_file.xsd')
  1. कमांडलाइन से xmllint का उपयोग करें । xmllint कई लिनक्स वितरण में स्थापित होता है।

>> xmllint --format --pretty 1 --load-trace --debug --schema /path/to/my_schema_file.xsd /path/to/my_xml_file.xml


मेरे पास 3 xsd फाइलें हैं, केवल जब सभी 3 xsd मौजूद हैं तो मैं एक xml को मान्य कर सकता हूं ... क्या यह आपकी विधि से किया जा सकता है?
नवीन

9

आप XMLml स्कीमा (XSD) के विरुद्ध xmlschema पायथन पैकेज के साथ आसानी से XML फ़ाइल या ट्री को सत्यापित कर सकते हैं । यह प्योर पायथन है, जो PyPi पर उपलब्ध है और इसमें कई निर्भरताएँ नहीं हैं।

उदाहरण - एक फ़ाइल को मान्य करें:

import xmlschema
xmlschema.validate('doc.xml', 'some.xsd')

यदि फ़ाइल XSD के विरुद्ध मान्य नहीं है, तो विधि एक अपवाद उठाती है। उस अपवाद में फिर कुछ उल्लंघन विवरण शामिल हैं।

यदि आप कई फ़ाइलों को मान्य करना चाहते हैं तो आपको केवल एक बार XSD लोड करना होगा:

xsd = xmlschema.XMLSchema('some.xsd')
for filename in filenames:
    xsd.validate(filename)

यदि आपको उस अपवाद की आवश्यकता नहीं है, जिसे आप इस तरह मान्य कर सकते हैं:

if xsd.is_valid('doc.xml'):
    print('do something useful')

वैकल्पिक रूप से, xmlschema सीधे फ़ाइल ऑब्जेक्ट्स और मेमोरी XML पेड़ों (या तो xml.etree.ElementTree या lxml के साथ बनाया गया) पर काम करता है। उदाहरण:

import xml.etree.ElementTree as ET
t = ET.parse('doc.xml')
result = xsd.is_valid(t)
print('Document is valid? {}'.format(result))

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.