IT

Python에서 XML 스키마로 유효성 검사

lottoking 2020. 8. 28. 19:36
반응형

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')
  1. 명령 줄에서 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

반응형