Python에서 XML 스키마로 검증
다른 파일에 XML 파일과 XML 스키마가 있는데 내 XML 파일이 스키마에 적용되는지 확인하려고 합니다.파이썬에서 어떻게 합니까?
표준 라이브러리를 사용하는 것을 선호하지만 필요한 경우 타사 패키지를 설치할 수 있습니다.
XSD 파일을 사용하는 것을 의미하는 것 같습니다.놀랍게도 이를 지원하는 파이썬 XML 라이브러리는 많지 않습니다.하지만 lxml은 합니다.lxml을 사용한 검증을 선택합니다.이 페이지에는 lxml을 사용하여 다른 스키마 유형으로 유효성을 검사하는 방법도 나와 있습니다.
인기 라이브러리 lxml을 사용하는 Python3의 단순 검증자 예제
설치 lxml
pip install lxml
라이브러리 libxml2에서 function 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
둘 이상의 파일의 유효성을 검사하기 위해 매번 XML 스키마 개체를 생성할 필요가 없으므로 다음과 같이 하십시오.
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을 사용한 검증
xmlschema Python 패키지를 사용하여 XSD(XML 스키마)에 대해 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로 생성됨)에서 직접 작동합니다.요소트리 또는 lxml).예:
import xml.etree.ElementTree as ET
t = ET.parse('doc.xml')
result = xsd.is_valid(t)
print('Document is valid? {}'.format(result))
"pure python" 솔루션의 경우: 패키지 인덱스는 다음을 나열합니다.
- pyxsd, 설명에 xml.etree를 사용한다고 나와 있습니다.cElement트리("pure python"은 아니지만 stdlib에 포함됨). 그러나 소스 코드는 xml.etree로 되돌아갔음을 나타냅니다.요소나무, 그래서 이것은 순수한 비단뱀으로 간주됩니다.사용해 본 적은 없지만 문서에 따르면 스키마 검증을 합니다.
- minixsv: '순수한' Python으로 작성된 경량 XML 스키마 검증기.그러나 설명에 "현재 XML 스키마 표준의 하위 집합이 지원됩니다"라고 표시되므로 이 값으로는 충분하지 않을 수 있습니다.
- W3C의 온라인 xsd validator에 사용되는 것으로 생각되는 XSV(더 이상 유지 관리되지 않는 것으로 생각되는 오래된 pyxml 패키지를 여전히 사용하는 것 같습니다)
이 작업을 수행할 수 있는 방법은 두 가지가 있습니다(실제로 더 많습니다).
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를 사용합니다.xmllint는 많은 리눅스 배포판에 설치되어 제공됩니다.
>> xmllint --format --pretty 1 --load-trace --debug --schema /path/to/my_schema_file.xsd /path/to/my_xml_file.xml
http://pyxb.sourceforge.net/ 의 PyXB 패키지는 XML 스키마 문서에서 Python에 대한 유효성 검사 바인딩을 생성합니다.거의 모든 스키마 구성을 처리하고 여러 네임스페이스를 지원합니다.
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))
import xmlschema
def get_validation_errors(xml_file, xsd_file):
schema = xmlschema.XMLSchema(xsd_file)
validation_error_iterator = schema.iter_errors(xml_file)
errors = list()
for idx, validation_error in enumerate(validation_error_iterator, start=1):
err = validation_error.__str__()
errors.append(err)
print(err)
return errors
errors = get_validation_errors('sample3.xml', 'sample_schema.xsd')
언급URL : https://stackoverflow.com/questions/299588/validating-with-an-xml-schema-in-python
'itsource' 카테고리의 다른 글
SHOW TABLES를 사용하여 뷰가 아닌 테이블만 가져오는 방법은 무엇입니까? (0) | 2023.07.26 |
---|---|
Spring MVC: @RequestParam과 @ModelAttribute의 차이점을 설명하십시오. (0) | 2023.07.26 |
PHP에서 고유하고 임시적인 파일 이름? (0) | 2023.07.26 |
거부된 요청을 가로채는 방법봄에는 예외? (0) | 2023.07.26 |
장고 버전 및 데이터베이스 지원(MariaDB) (0) | 2023.07.26 |