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


104

다른 파일에 XML 파일과 XML 스키마가 있고 내 XML 파일이 스키마를 준수하는지 확인하고 싶습니다. 파이썬에서 어떻게합니까?

표준 라이브러리를 사용하는 것을 선호하지만 필요한 경우 타사 패키지를 설치할 수 있습니다.

답변:


61

XSD 파일 사용을 의미한다고 가정합니다. 놀랍게도이를 지원하는 파이썬 XML 라이브러리는 많지 않습니다. 그러나 lxml은 그렇지 않습니다. lxml으로 유효성 검사를 확인하십시오 . 이 페이지에는 lxml을 사용하여 다른 스키마 유형을 검증하는 방법도 나열되어 있습니다.


1
lxml은 순수한 파이썬입니까? (컴파일 / 설치가 필요하거나 파이썬 스크립트에 포함시킬 수 있습니다.)
sorin

9
@Sorin : lxml은 libxml2 C 라이브러리 위에있는 래퍼이므로 순수한 Python이 아닙니다.
Eli Courtwright

2
@eli 정확히 내가 밑줄을 치고 싶었던 것은 누구에게도 적합하지 않을 수 있습니다.
sorin 2010-07-08

1
유효성 검사 오류는 사용자에게 친숙하지 않습니다. 어떻게하면 되나요? mailman-mail5.webfaction.com/pipermail/lxml/2012-April/… 은 도움이되지 않습니다.
None-da

이 답변이 여전히 최신입니까?
Human

27

"순수한 파이썬"솔루션 : 패키지 색인 목록 :

  • pyxsd , 설명에서는 "순수한 파이썬"이 아닌 (하지만 stdlib에 포함 된) xml.etree.cElementTree를 사용한다고 말하지만 소스 코드는 xml.etree.ElementTree로 돌아가는 것을 나타내므로 이것은 순수한 파이썬으로 간주됩니다. 사용하지 않았지만 문서에 따르면 스키마 유효성 검사를 수행합니다.
  • minixsv : ' "순수한"Python으로 작성된 경량 XML 스키마 유효성 검사기'. 그러나 설명에는 "현재 XML 스키마 표준의 하위 집합이 지원됩니다"라고 나와 있으므로 이것으로 충분하지 않을 수 있습니다.
  • XSV 나는 W3C의 온라인 XSD 유효성 검사기에 사용되는 생각, (여전히 내가 더 이상 유지되지 않습니다 생각 이전 PyXML에는 패키지를 사용하는 것)

5
나는 이것들을 통해 PyXB를 살펴볼 것입니다. 이러한 상태의 대부분은 불완전하고 다소 "죽은"것처럼 보입니다. pyxsd는 2006 년에 마지막으로 업데이트되었고, minixsv는 2008 년에 마지막으로 업데이트되었으며, XSV는 2007 년에 제가 아는 한 말입니다. 항상 하나의 패키지를 다른 패키지보다 고려하는 가장 좋은 이유는 아니지만이 경우에는 정당하다고 생각합니다.
oob

2
PyXB의 경우 +1. Admin 섹션에 삽입 된 원시 XML의 유효성을 검사하기 위해 Django에서 사용하고 있습니다. 간단하고 사용하기 쉽습니다.
tatlar

21

인기있는 라이브러리 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 객체 를 만들 필요가 없습니다 .

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을 사용한 유효성 검사


14

http://pyxb.sourceforge.net/ 의 PyXB 패키지는 XML 스키마 문서에서 Python에 대한 유효성 검사 바인딩을 생성합니다. 거의 모든 스키마 구성을 처리하고 여러 네임 스페이스를 지원합니다.


12

이렇게 할 수있는 방법은 두 가지가 있습니다 (실제로 더 있습니다).
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


3 개의 xsd 파일이 있습니다. 3 개의 xsd가 모두있을 때만 xml의 유효성을 검사 할 수 있습니다 ...이 방법으로 수행 할 수 있습니까?
Naveen

9

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))

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.