답변:
XSD 파일 사용을 의미한다고 가정합니다. 놀랍게도이를 지원하는 파이썬 XML 라이브러리는 많지 않습니다. 그러나 lxml은 그렇지 않습니다. lxml으로 유효성 검사를 확인하십시오 . 이 페이지에는 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
가장 간단한 유효성 검사기
가장 간단한 validator.py를 만들어 보겠습니다.
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! :(')
약간의 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! :(')
더 많은 옵션을 보려면 여기를 읽으십시오 : lxml을 사용한 유효성 검사
http://pyxb.sourceforge.net/ 의 PyXB 패키지는 XML 스키마 문서에서 Python에 대한 유효성 검사 바인딩을 생성합니다. 거의 모든 스키마 구성을 처리하고 여러 네임 스페이스를 지원합니다.
이렇게 할 수있는 방법은 두 가지가 있습니다 (실제로 더 있습니다).
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')
>> xmllint --format --pretty 1 --load-trace --debug --schema /path/to/my_schema_file.xsd /path/to/my_xml_file.xml
xmlschema Python 패키지를 사용하여 XML 스키마 (XSD)에 대해 XML 파일 또는 트리를 쉽게 검증 할 수 있습니다 . PyPi 에서 사용할 수있는 순수 Python이며 종속성이 많지 않습니다.
예-파일 유효성 검사 :
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))
lxml은 etree.DTD를 제공합니다.
http://lxml.de/api/lxml.tests.test_dtd-pysrc.html 의 테스트에서
...
root = etree.XML(_bytes("<b/>"))
dtd = etree.DTD(BytesIO("<!ELEMENT b EMPTY>"))
self.assert_(dtd.validate(root))