Использование XSD в PySpark

#azure #pyspark #xsd #synapse

Вопрос:

Я создаю хранилище данных в Azure Synapse, где одним из источников является около 20 различных типов XML-файлов (с другой схемой XSD) и 1 базовая схема.

То, что я ищу, — это получить все XML-элементы и сохранить их в файлах (по 1 на тип) в моем озере данных. Для этого мне нужно иметь уникальные имена для каждого элемента, например, весь путь в качестве имени. Я попытался определить диктанты для каждого типа со всеми именами элементов, но это довольно сложная работа. Чтобы автоматизировать это (XSD обновляются ежегодно), я попытался закодировать это в Excel и VBA, но XSD довольно сложны с вложенными сложными типами и т. Д. Ниже приведен фрагмент базового файла.xsd:

 <?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.website.org/typ/1/baseschema/schema" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:iwmo="http://www.website.org/typ/1/baseschema/schema">
    <xs:complexType name="Complex_Address">
        ...
        <xs:sequence>
            <xs:element name="Home" type="iwmo:Complex_House" minOccurs="0">
                ...
            </xs:element>
            <xs:element name="Postalcode" type="iwmo:Simple_Postalcode" minOccurs="0">
                ...
            </xs:element>
            <xs:element name="Streetname" type="iwmo:Simple_Streetname" minOccurs="0">
                ...
            </xs:element>
            <xs:element name="Areaname" type="iwmo:Simple_Areaname" minOccurs="0">
                ...
            </xs:element>
            <xs:element name="CountryCode" type="iwmo:Simple_CountryCode" minOccurs="0">
                ...
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Complex_House">
        ...
        <xs:sequence>
            <xs:element name="Housenumber" type="iwmo:Simple_Housenumber">
                ...
            </xs:element>
            <xs:element name="Houseletter" type="iwmo:Simple_Houseletter" minOccurs="0">
                ...
            </xs:element>
            <xs:element name="HousenumberAddition" type="iwmo:Simple_HousenumberAddition" minOccurs="0">
                ...
            </xs:element>
            <xs:element name="IndicationAddress" type="iwmo:Simple_IndicationAddress" minOccurs="0">
                ...
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Complex_MessageIdentification">
            ...
        <xs:sequence>
            <xs:element name="Identification" type="iwmo:Simple_IdentificationMessage">
                ...
            </xs:element>
            <xs:element name="Date" type="iwmo:Simple_Date">
                ...
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Complex_Product">
            ...
        <xs:sequence>
            <xs:element name="Categorie" type="iwmo:Simple_ProductCategory">
                ...
            </xs:element>
            <xs:element name="Code" type="iwmo:Simple_ProductCode" minOccurs="0">
                ...
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Complex_XsdVersion">
        <xs:sequence>
            <xs:element name="BaseschemaXsdVersion" type="iwmo:Simple_Version">
            </xs:element>
            <xs:element name="MessageXsdVersion" type="iwmo:Simple_Version">
            </xs:element>
        </xs:sequence>
    </xs:complexType>
 

А вот фрагмент xsd 1 из типов сообщений:

 <?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:typ="http://www.website.org/typ/1/baseschema/schema" xmlns:type1="http://www.website.org/typ/1/type1/schema" targetNamespace="http://www.website.org/typ/1/type1/schema" elementFormDefault="qualified">
    <xs:import namespace="http://www.website.org/typ/1/baseschema/schema" schemaLocation="baseschema.xsd"></xs:import>
    <xs:element name="Message" type="type1:Root"></xs:element>
    <xs:complexType name="Root">
        ...
        <xs:sequence>
            <xs:element name="Header" type="type1:Header"></xs:element>
            <xs:element name="Client" type="type1:Client"></xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Header">
        <xs:sequence>
            <xs:element name="Person" type="typ:Simple_SpecialCode">
                ...
            </xs:element>
            <xs:element name="MessageIdentification" type="typ:Complex_MessageIdentification">
                ...
            </xs:element>
            <xs:element name="XsdVersion" type="typ:Complex_XsdVersion">
                ...
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Client">
                ...
        <xs:sequence>
            <xs:element name="AssignedProducts" type="type1:AssignedProducts"></xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="AssignedProducts">
        <xs:sequence>
            <xs:element name="AssignedProduct" type="type1:AssignedProduct"  maxOccurs="unbounded"></xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="AssignedProduct">
        ...
        <xs:sequence>
            <xs:element name="ToewijzingNummer" type="typ:Simple_Nummer">
                ...
            </xs:element>
            <xs:element name="Product" type="typ:Complex_Product" minOccurs="0">
                ...
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
 

Тогда это был бы желаемый результат:

 Header_Person
Header_MessageIdentification_Identification
Header_MessageIdentification_Date
Header_XsdVersion_BaseschemaXsdVersion
Header_XsdVersion_MessageXsdVersion
Client_AssignedProduct_ToewijzingNummer
Client_AssignedProduct_Product_Category
Client_AssignedProduct_Product_Code
 

В базовой схеме я также добавил вложенный сложный тип, чтобы показать сложность.

Есть ли какой-то пакет или что-то в Python, что может помочь мне достичь этого? Также было бы здорово использовать инструмент, который может просто создать этот список элементов в текстовом файле, тогда я смогу легко скопировать его в переменную.

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

Рональд

Комментарии:

1. В конце концов, я нашел обходной путь, где я поместил все поля из xsd в переменные.

Ответ №1:

В конце концов, я нашел обходной путь, где я поместил все поля из xsd в переменные. Это не идеально, но любой другой способ был бы слишком сложным.