Ví dụ về trình xác thực đơn giản trong Python3 sử dụng thư viện phổ biến lxml
Cài đặt lxml
pip install lxml
Nếu bạn gặp lỗi như "Không thể tìm thấy hàm xmlCheckVersion trong thư viện libxml2. Đã cài đặt libxml2 chưa?" , hãy thử làm điều này trước:
# 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
Trình xác thực đơn giản nhất
Hãy tạo validator.py đơn giản nhất
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
sau đó viết và chạy main.py
from validator import validate
if validate("path/to/file.xml", "path/to/scheme.xsd"):
print('Valid! :)')
else:
print('Not valid! :(')
Một chút OOP
Để xác thực nhiều hơn một tệp, không cần tạo đối tượng XMLSchema mọi lúc, do đó:
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
Bây giờ chúng ta có thể xác thực tất cả các tệp trong thư mục như sau:
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! :(')
Để biết thêm các tùy chọn, hãy đọc tại đây: Xác thực bằng lxml