পাইথনে একটি এক্সএমএল স্কিমা দিয়ে বৈধকরণ


104

আমার অন্য একটি ফাইলে একটি এক্সএমএল ফাইল এবং একটি এক্সএমএল স্কিমা রয়েছে এবং আমি যাচাই করতে চাই যে আমার এক্সএমএল ফাইলটি স্কিমাতে মেনে চলে। পাইথনে আমি কীভাবে এটি করব?

আমি স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে কিছু পছন্দ করব তবে প্রয়োজনে তৃতীয় পক্ষের প্যাকেজটি ইনস্টল করতে পারি।

উত্তর:


61

আমি ধরে নিচ্ছি আপনার XSD ফাইলগুলি ব্যবহার করার অর্থ। আশ্চর্যজনকভাবে এমন কোনও পাইথন এক্সএমএল লাইব্রেরি নেই যা এটি সমর্থন করে। lxML তবে। LxML সহ বৈধতা যাচাই করুন । অন্যান্য স্কিমার ধরণের সাথে বৈধতা পেতে কীভাবে lxML ব্যবহার করতে হয় তা পৃষ্ঠাতে তালিকাবদ্ধ রয়েছে।


1
lxML খাঁটি অজগর নাকি? (সংকলন / ইনস্টলেশন প্রয়োজন হয় বা আপনি কেবল আপনার পাইথন স্ক্রিপ্টগুলির সাথে এটি অন্তর্ভুক্ত করতে পারেন)
সোরিন

9
@ সোরিন: lxML হল লাইবক্সিএমএল 2 সি লাইব্রেরির উপরে একটি মোড়ক এবং এটি খাঁটি পাইথন নয়।
এলি কোর্টরাইট

2
@ এলি ঠিক কীভাবে আমি আন্ডারলাইন করতে চেয়েছিলাম, এটি কারও পক্ষে উপযুক্ত নাও হতে পারে।
sorin

1
বৈধতা ত্রুটিগুলি ব্যবহারকারী-বান্ধব নয়। আমি কিভাবে এটি সম্পর্কে যেতে হবে? mailman-mail5.webfaction.com/pipermail/lxML/2012- এপ্রিল/… সাহায্য করে না।
কোনটি-দা

এই উত্তর এখনও আপ টু ডেট আছে?
হিউম্যান

27

"খাঁটি পাইথন" সমাধান হিসাবে: প্যাকেজ সূচক তালিকা:

  • পাইসএসডি , বিবরণে বলা হয়েছে যে এটি xml.etree.cElementTree ব্যবহার করে, যা "খাঁটি পাইথন" নয় (তবে stdlib এর অন্তর্ভুক্ত), তবে উত্স কোডটি ইঙ্গিত করে যে এটি xML.etree.ElementTree এ ফিরে আসে, সুতরাং এটি খাঁটি অজগর হিসাবে গণ্য হবে। এটি ব্যবহার করেন নি, তবে ডক্স অনুসারে এটি স্কিমা যাচাই করে।
  • minixsv : 'একটি হালকা ওজনের এক্সএমএল স্কিমা যাচাইকারী' খাঁটি " পাইথনটিতে লেখা। তবে বর্ণনায় বলা হয়েছে "বর্তমানে এক্সএমএল স্কিমা স্ট্যান্ডার্ডের একটি উপসেট সমর্থিত", সুতরাং এটি যথেষ্ট নাও হতে পারে।
  • এক্সএসভি , যা আমি মনে করি ডাব্লু 3 সি এর অনলাইন এক্সএসডি যাচাইকারীর জন্য ব্যবহৃত হয়েছে (এটি এখনও পুরানো পাইক্সিমিএল প্যাকেজটি ব্যবহার করার মতো মনে হয়, যা আমার মনে হয় আর রক্ষণাবেক্ষণ করা হয় না)

5
আমি এগুলির উপরে পাইএক্সবিতে একবার নজর দেব। এগুলির বেশিরভাগ রাজ্যের মতো এগুলি অসম্পূর্ণ এবং এগুলি কিছুটা "মৃত" বলে মনে হচ্ছে। পাইক্সএসডি সর্বশেষ ২০০ 2006 সালে আপডেট হয়েছিল, ২০০৮ সালে মিনিক্সভ সর্বশেষ আপডেট হয়েছে, ২০০S সালে এক্সএসভি পর্যন্ত আমি বলতে পারি। একটি প্যাকেজ অন্যটির উপর বিবেচনা করার জন্য সর্বদা সর্বোত্তম কারণ নয়, তবে আমি মনে করি এটি এক্ষেত্রে ন্যায়সঙ্গত।
oob

2
পাইএক্সবি এর জন্য +1। আমি অ্যাডমিন বিভাগে rawোকানো কাঁচা এক্সএমএলকে বৈধতা দেওয়ার জন্য এটি জাঙ্গোতে ব্যবহার করছি। সহজ এবং ব্যবহার সহজ।
ট্যাটলার

21

জনপ্রিয় লাইব্রেরি lxML ব্যবহার করে পাইথন 3-তে একটি সাধারণ বৈধতার উদাহরণ

ইনস্টলেশন 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

তারপরে লিখুন এবং main.py চালান

from validator import validate

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

কিছুটা ওওপি

একাধিক ফাইল যাচাই করার জন্য, প্রতিবার একটি এক্সএমএলস্কেমা অবজেক্ট তৈরি করার দরকার নেই , সুতরাং:

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! :(')

আরও বিকল্পের জন্য এখানে পড়ুন: lxML সহ বৈধতা


14

Http://pyxb.sourceforge.net/ এ পাইএক্সবি প্যাকেজটি এক্সএমএল স্কিমা ডকুমেন্ট থেকে পাইথনের বৈধকরণের বাইন্ডিং তৈরি করে। এটি প্রায় প্রতিটি স্কিমা নির্মান পরিচালনা করে এবং একাধিক নেমস্পেস সমর্থন করে।


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 এক্সএসডি ফাইল রয়েছে, যখন সমস্ত 3 এক্সএসডি উপস্থিত থাকে কেবল তখনই আমি একটি এক্সএমএল যাচাই করতে পারি ... এটি কি আপনার পদ্ধতিতে করা যায়?
নবীন

9

আপনি এক্সএমএল স্কিমা ( এক্সএসডি ) এর বিপরীতে একটি এক্সএমএল ফাইল বা গাছকে সহজেই এক্সএমএলসচিমা পাইথন প্যাকেজ দিয়ে যাচাই করতে পারেন । এটি খাঁটি পাইথন, পাইপিতে পাওয়া যায় এবং এর অনেকগুলি নির্ভরতা নেই।

উদাহরণ - একটি ফাইল যাচাই করুন:

import xmlschema
xmlschema.validate('doc.xml', 'some.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))

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.