Разобрать XSD-файл, чтобы получить имена и описания - PullRequest
1 голос
/ 11 апреля 2019

Я пытаюсь разобрать этот XSD-файл, в настоящее время пытающийся в python, поймать имя элемента и описание данных.

Пример XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="07112016">
    <xs:annotation>
        <xs:documentation>Level 1: top level of Procurement Data Standard for a procurement instrument document.</xs:documentation>
    </xs:annotation>
    <xs:element name="ProcurementDocument">
        <xs:annotation>
            <xs:documentation>The root element for any procurement instrument document</xs:documentation>

Здесь он будет захватывать name: ProcurementDocument и desc:The root element for any procurement instrument document.

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

Вот мой полный код, который я пытался использовать, чтобы получить все случаи из моего минимизированного XSD, но нашел только ~ 120 из ~ 1500, которые я пытался найти.

import re
import pandas as pd

df = pd.DataFrame({'Names': [ ], 'Description': [ ]})

search_str = r"name=\"(?P<name>\w+)\"\>[\w\<\/\.\>\d:]+documentation\>(?P<desc>[\w\s\.]+)\<\/"
file1 = 'mini_text.xml'

with open(file1, 'r') as f:
    xml_string = f.read()
idx = 0
for m in re.finditer(search_str, xml_string):
    df.loc[idx, 'Names'] = m.group('name')
    df.loc[idx, 'Description'] = m.group('desc')
    idx += 1

df.to_csv('output.txt', index=False, sep="\t")

1 Ответ

1 голос
/ 11 апреля 2019

Вы должны избегать синтаксического анализа xml / html / json с использованием регулярных выражений, так как регулярные выражения недостаточно способны для анализа вложенных структур.

Причина, по которой ваше регулярное выражение не охватывает все экземпляры имени и описания в вашем тексте, заключается в том, что набор символов, выбранный вами для захвата описания [\w\s\.]+, недостаточен, так как в описании присутствуют такие символы, как скобки (see list) из-за чего дальнейшие ожидаемые совпадения проваливаются. Попробуйте изменить [\w\s\.]+ на .+?, и тогда оно будет работать. Проверьте ниже свою обновленную демонстрационную ссылку regex101.

Рабочая демонстрация вашего измененного регулярного выражения

Редактировать: пример, показывающий, как анализировать xml с помощью Beautiful Soup для получения необходимой информации

import re
from bs4 import BeautifulSoup

data = '''<xs:element name="ProductDescription"><xs:annotation><xs:documentation>Provides the description of the product</xs:documentation></xs:annotation><xs:complexType><xs:sequence><xs:element name="ProductName"><xs:annotation><xs:documentation>Provides a name for the product. (see list)</xs:documentation></xs:annotation><xs:simpleType><xs:restriction base="xs:token"><xs:enumeration value="Barbie Doll"/><xs:enumeration value="Ken Doll"/></xs:restriction></xs:simpleType></xs:element><xs:element name="ProductSize"><xs:annotation><xs:documentation>Describes the size of the product. (see list)</xs:documentation></xs:annotation><xs:simpleType><xs:restriction base="xs:token"><xs:enumeration value="Small"/><xs:enumeration value="Medium"/><xs:enumeration value="Large"/><xs:enumeration value="Dayum"/></xs:restriction></xs:simpleType></xs:element></xs:sequence></xs:complexType></xs:element>'''

soup = BeautifulSoup(data)

for element in soup.find_all('xs:element'):
 print(element['name'])  # prints name attribute value
 print(element.find('xs:documentation').get_text(),'\n')  # prints inner text of xs:documentation tag

Печатает имя и описание, как вы хотели,

ProductDescription
Provides the description of the product

ProductName
Provides a name for the product. (see list)

ProductSize
Describes the size of the product. (see list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...