Разбор XML файлов и проверка по схеме xsd - PullRequest
1 голос
/ 06 февраля 2020

Это пример вывода XML, который мне нужно проанализировать и проверить по файлам схемы xsd.

<Record_Delimiter DocumentID="1.1" DocumentType="PARENT" DocumentName="SCHOOL" RelatedDocumentID=""/>
<xs:SCHOOL>
    <xs:Name>some name</xs:Name>
    <xs:ID>5908390481</xs:ID>
    <xs:Address>some address</xs:Address>
</xs:SCHOOL>
<Record_Delimiter DocumentID="1.2" DocumentType="CHILD" DocumentName="STUDENTEXP" RelatedDocumentID="1.1"/>
<xs:STUDENTEXP>
    <xs:STUDENT>
        <xs:Name>some name</xs:Name>
        <xs:SID>s1036456</xs:SID>
        <xs:Age>12</xs:Age>
        <xs:Address>some address</xs:Address>
                <xs:Expenses>
                <xs:Fees>800</xs:Fees>
                <xs:Books>100</xs:Books>
                <xs:Uniform>50</xs:Uniform>
                <xs:Transport>10</xs:Transport>
            </xs:Expenses>
    </xs:STUDENT>
</xs:STUDENTEXP>
<Record_Delimiter DocumentID="1.3" DocumentType="CHILD" DocumentName="STUDENTEXP" RelatedDocumentID="1.1"/>
<xs:STUDENTEXP>
    <xs:STUDENT>
        <xs:Name>some name</xs:Name>
        <xs:SID>s1036789</xs:SID>
        <xs:Age>15</xs:Age>
        <xs:Address>some address</xs:Address>
        <xs:Expenses>
            <xs:Fees>1000</xs:Fees>
            <xs:Books>200</xs:Books>
            <xs:Uniform>50</xs:Uniform>
            <xs:Transport>10</xs:Transport>
        </xs:Expenses>
    </xs:STUDENT>
</xs:STUDENTEXP>

Этот файл сам по себе недопустим XML, поскольку нет единого тега, охватывающего все другие теги. Но каждая запись (ie, SCHOOL и STUDENTEXP) действительна XML, и она проверяется по схеме (school.xsd, studentexp.xsd).

Я никогда не работал с этим форматом и не уверен насчет нескольких такие вещи, как, как разобрать такой файл программно? Обычно используя l xml, мы можем проверить каждую запись, если она была в отдельном файле:

xmlschema = etree.XMLSchema(etree.parse('./studentexp.xsd'))
xmlschema.assertValidate(etree.parse('./sampleStudentexp.xml'))  

Как правильно извлечь «записи» и проверить их отдельно?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2020

l xml имеет разбор событий на основе тегов. инкрементальный разбор событий и ниже работает.

parser = etree.XMLPullParser(events=('start', 'end'))
events = parser.read_events()

with open('.\sample.xml', 'rb') as f:
    d1 = deque()
    for line in f:
        parser.feed(line)
        for action, e in events:
            if action == 'start':
                d1.append(e.tag)
            elif action == 'end' and len(d1) == 1:
                if d1.pop() == e.tag:
                    root = parser.close()
                    print(etree.tostring(root, pretty_print=True, encoding="UTF-8").decode("UTF-8"))
            else:
                d1.pop()
0 голосов
/ 06 февраля 2020

Этот вопрос задавался ранее: Анализ файла xml с несколькими элементами root в python

Я подозреваю, что существует однопроходное решение, которое включает используя потоковый парсер. Мой Python недостаточно силен, чтобы понять, возможно ли это. В любом случае - одно из решений в этой теме может быть достаточно хорошим.

...