Python에서 XML 스키마로 유효성 검사
다른 파일에 XML 파일과 XML 스키마가 있고 내 XML 파일이 스키마를 준수하는지 확인하고 싶습니다. 어디에서 어떻게합니까?
표준 라이브러리를 사용하는 것이 선호하지만 필요한 경우에는 패키지를 사용할 수 있습니다.
XSD 파일 사용을 의미합니다. 놀랍게도이를 지원하는 기술 XML 라이브러리는 많지 않습니다. 그러나 lxml은 lxml으로 유효성 검사를 확인하십시오 . 이 페이지에는 lxml을 사용하여 다른 스키마 유형을 사용하는 방법도 있고 있습니다.
"순수한"솔루션 : 패키지 색인 목록 :
- pyxsd , 설명은 "순수"이 아닌 (하지만 stdlib에 포함 된) xml.etree.cElementTree를 사용하는 것이 말하고 소스 코드는 xml.etree.ElementTree로 돌아가는 것을 의미합니다. 사용하지 않는 문서에 따르면 스키마 유효성 검사를 수행합니다.
- minixsv : ' "순수한"Python으로 경량 XML 스키마 유효성 검사기'. 그러나 설명에는 "현재 XML 스키마 표준의 하위 집합이 지원됨"이라고 나와 있으므로 이것만으로는 않을 수 있습니다.
- XSV 나는 W3C의 온라인 XSD 유효성 검사기에 사용되는 생각, (여전히 내가 더 이상 유지되지 않는 언어 생각 이전 PyXML에는 패키지를 사용하는 것)
인기있는 라이브러리 lxml을 사용하는 Python3의 간단한 유효성 검사기의 예
설치 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 object- 를 만들 필요가 없습니다 .
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 를 사용 합니다. xmllint는 많은 리눅스 배포판에 설치되어 있습니다.
>> xmllint --format --pretty 1 --load-trace --debug --schema /path/to/my_schema_file.xsd /path/to/my_xml_file.xml
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))
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))
참고 URL : https://stackoverflow.com/questions/299588/validating-with-an-xml-schema-in-python
'IT' 카테고리의 다른 글
PostgreSQL에서 CHARACTER VARYING과 VARCHAR의 차이점은 무엇입니까? (0) | 2020.08.28 |
---|---|
Windows64가 x86-64의 다른 모든 OS와 다른 호출 규칙을 사용하는 이유는 무엇입니까? (0) | 2020.08.28 |
Numpy : 빠른 가치의 첫 번째 눈길 찾기 (0) | 2020.08.28 |
YAML에서 파이프 기호를 사용하는 것은 무엇입니까? (0) | 2020.08.28 |
Pandoc 마크 다운 페이지 나누기 (0) | 2020.08.28 |