Este projeto contém um script Python que converte um arquivo JSON plano em um JSON com estrutura aninhada, um arquivo XML, um esquema XSD e um esquema XSD para SAP a partir do JSON aninhado.
example.txt: Arquivo de entrada contendo o JSON plano.convert.py: Script Python que realiza a conversão.requirements.txt: Arquivo de configuração das dependências do projeto.example.json: Arquivo de saída contendo o JSON aninhado.example.xml: Arquivo de saída contendo o XML gerado.example.xsd: Arquivo de saída contendo o esquema XSD gerado.example_SAP.xsd: Arquivo de saída contendo o esquema XSD com substituição de prefixo paraxsd:gerado.example_change_name.json: Arquivo de mapeamento de chaves que foram alteradas.
Esta função converte um dicionário plano em um dicionário aninhado.
- Parâmetros:
flat_dict(dict): Dicionário plano a ser convertido.
- Retorno:
result(dict): Dicionário aninhado.
Esta função remove valores vazios de um dicionário.
- Parâmetros:
data(dict): Dicionário a ser limpo.
- Retorno:
data(dict): Dicionário limpo.
Esta função gera um elemento XSD a partir de um dicionário.
- Parâmetros:
name(str): Nome do elemento.value(any): Valor do elemento.fileName(str): Nome do arquivo com as chaves que foram alteradas.root(str): Nome do elemento raiz. Padrão é 'root'.
- Retorno:
xsd_element(Element): Elemento XSD gerado.
Esta função obtém o tipo XSD com base no tipo do valor.
- Parâmetros:
value(any): Valor para determinar o tipo XSD.
- Retorno:
type(str): Tipo XSD correspondente.
Esta função substitui caracteres inválidos em nomes de elementos XML.
- Parâmetros:
name(str): Nome do elemento.fileName(str): Nome do arquivo com as chaves que foram alteradas. Parâmetro padrão échange_name.json.
- Retorno:
new_name(str): Nome do elemento sanitizado.
Esta função substitui o prefixo xs por xsd no conteúdo do XSD.
- Parâmetros:
content(str): Conteúdo do XSD.
- Retorno:
content(str): Conteúdo do XSD com o prefixo substituído.
Esta função converte um dicionário JSON em um esquema XSD.
- Parâmetros:
data(dict): Dicionário JSON a ser convertido.fileName(str): Nome do arquivo com as chaves que foram alteradas.root(str): Nome do elemento raiz. Padrão é 'root'.
- Retorno:
xsd_schema(Element): Esquema XSD gerado.
Esta função converte um dicionário JSON em um XML.
- Parâmetros:
element_name(str): Nome do elemento raiz.data(dict): Dicionário JSON a ser convertido.fileName(str): Nome do arquivo com as chaves que foram alteradas.
- Retorno:
xml_element(Element): Elemento XML gerado.
A função convert do script realiza as seguintes etapas:
- Captura o nome do arquivo.
- Cria o arquivo de mapeamento de chaves alteradas.
- Carrega o conteúdo do arquivo JSON flat ou aninhado.
- Converte o conteúdo JSON em um dicionário.
- Converte o dicionário plano em um dicionário aninhado.
- Remove valores vazios do dicionário aninhado.
- Salva o JSON aninhado com o nome do arquivo original.
- Gera o esquema XSD a partir do JSON aninhado.
- Salva o esquema XSD com o nome do arquivo original.
- Altera o prefixo de
xs:paraxsd:. - Salva o esquema XSD com o nome do arquivo original com adicional de
_SAP. - Converte o JSON aninhado em XML.
- Salva o XML com o nome do arquivo original.
- Parâmetros:
fileName(str): Nome do arquivo JSON flat ou aninhado.root(str): Nome do elemento raiz. Padrão é 'root'.
Esta função valida um arquivo XML contra um arquivo XSD.
- Carrega o arquivo XML.
- Carrega o arquivo XSD.
- Valida o arquivo XML contra o arquivo XSD.
- Parâmetros:
file(str): Nome do arquivo XML e XSD a ser validado.
Chama as funções convert e validate_xml_xsd passando um arquivo da lista de arquivos a serem validados.
-
Coloque os arquivos que queira converter na mesma pasta que o script
convert.py. -
Adicione os nomes do elemento raiz com a chave
roote os nomes dos arquivos com as extensões com a chavefilena variávellistFilesdentro da função principal. Conforme exemplo abaixo:listFiles = [ { 'root': 'example', 'file': 'example.txt' } ]
-
Instale as dependências listadas no
requirements.txt:pip install -r requirements.txt
-
Execute o script
convert.py:python convert.py
-
Verifique os arquivos de saída
*.json,*.xml,*.xsde*_SAP.xsdgerados na mesma pasta.
listFiles = [
{
'root': 'example',
'file': 'example.txt'
}
]{
"serviceContextId": "123a654b-a1b2-c3d4-e5f6-12345f65f98e",
"data": {
"K-Application.Id": "ABCD001122334455",
"K-Application.Decision.Name": "TesteNome",
"K-Application.Order": "08",
"K-Application.Client.DataClient[1].Concentrate.RegistrationData.Name": "AAAAAA",
"K-Application.Client.DataClient[1].Concentrate.Score.Value": "BBBBBB",
"K-Application.Client.DataClient[1].Dist.Score.Model[1]": "CCCCCC",
"K-Application.Client.DataClient[1].Dist.Score.Model[2]": "DDDDDD",
"K-Application.Client.DataClient[2].Concentrate.RegistrationData.Name": "EEEEEE",
"K-Application.Client.DataClient[2].Concentrate.Score.Value": "FFFFFF",
"K-Application.Client.DataClient[2].Dist.Score.Model[1]": "GGGGGG",
"K-Application.Client.DataClient[2].Dist.Score.Model[2]": "HHHHHH",
"Error.Message[1].IdMessage": "HHHHHH",
"Key.A-set.Value[1]": "IIIIII",
"Key.A-set.Value[2]": "JJJJJJ",
"Key.A-set.Value[3]": "KKKKKK",
"Key.A-set.Value[4]": "LLLLLL",
"Key.A-set.Value[5]": "MMMMMM"
}
}{
"data": {
"Error": {
"Message": [
{
"IdMessage": "HHHHHH"
}
]
},
"K-Application": {
"Client": {
"DataClient": [
{
"Concentrate": {
"RegistrationData": {
"Name": "AAAAAA"
},
"Score": {
"Value": "BBBBBB"
}
},
"Dist": {
"Score": {
"Model": ["CCCCCC", "DDDDDD"]
}
}
},
{
"Concentrate": {
"RegistrationData": {
"Name": "EEEEEE"
},
"Score": {
"Value": "FFFFFF"
}
},
"Dist": {
"Score": {
"Model": ["GGGGGG", "HHHHHH"]
}
}
}
]
},
"Decision": {
"Name": "TesteNome"
},
"Id": "ABCD001122334455",
"Order": "08"
},
"Key": {
"A-set": {
"Value": ["IIIIII", "JJJJJJ", "KKKKKK", "LLLLLL", "MMMMMM"]
}
}
},
"serviceContextId": "123a654b-a1b2-c3d4-e5f6-12345f65f98e"
}<?xml version="1.0"?>
<example>
<data>
<Error>
<Message>
<IdMessage>HHHHHH</IdMessage>
</Message>
</Error>
<K_Application>
<Client>
<DataClient>
<Concentrate>
<RegistrationData>
<Name>AAAAAA</Name>
</RegistrationData>
<Score>
<Value>BBBBBB</Value>
</Score>
</Concentrate>
<Dist>
<Score>
<Model>CCCCCC</Model>
<Model>DDDDDD</Model>
</Score>
</Dist>
</DataClient>
<DataClient>
<Concentrate>
<RegistrationData>
<Name>EEEEEE</Name>
</RegistrationData>
<Score>
<Value>FFFFFF</Value>
</Score>
</Concentrate>
<Dist>
<Score>
<Model>GGGGGG</Model>
<Model>HHHHHH</Model>
</Score>
</Dist>
</DataClient>
</Client>
<Decision>
<Name>TesteNome</Name>
</Decision>
<Id>ABCD001122334455</Id>
<Order>08</Order>
</K_Application>
<Key>
<A_set>
<Value>IIIIII</Value>
<Value>JJJJJJ</Value>
<Value>KKKKKK</Value>
<Value>LLLLLL</Value>
<Value>MMMMMM</Value>
</A_set>
</Key>
</data>
<serviceContextId>123a654b-a1b2-c3d4-e5f6-12345f65f98e</serviceContextId>
</example><?xml version='1.0' encoding='utf-8'?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="example">
<xs:sequence>
<xs:element name="data">
<xs:complexType>
<xs:sequence>
<xs:element name="Error">
<xs:complexType>
<xs:sequence>
<xs:element name="Message" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="IdMessage" type="xs:string" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="K_Application">
<xs:complexType>
<xs:sequence>
<xs:element name="Client">
<xs:complexType>
<xs:sequence>
<xs:element name="DataClient" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Concentrate">
<xs:complexType>
<xs:sequence>
<xs:element name="RegistrationData">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Score">
<xs:complexType>
<xs:sequence>
<xs:element name="Value" type="xs:string" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Dist">
<xs:complexType>
<xs:sequence>
<xs:element name="Score">
<xs:complexType>
<xs:sequence>
<xs:element name="Model" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Decision">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Id" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="Order" type="xs:string" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Key">
<xs:complexType>
<xs:sequence>
<xs:element name="A_set">
<xs:complexType>
<xs:sequence>
<xs:element name="Value" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="serviceContextId" type="xs:string" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:schema><?xml version='1.0' encoding='utf-8'?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="example">
<xsd:sequence>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Error">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Message" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="IdMessage" type="xsd:string" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="K_Application">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Client">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="DataClient" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Concentrate">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="RegistrationData">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Name" type="xsd:string" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Score">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Value" type="xsd:string" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Dist">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Score">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Model" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Decision">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Name" type="xsd:string" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Id" type="xsd:string" minOccurs="0" maxOccurs="1"/>
<xsd:element name="Order" type="xsd:string" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Key">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="A_set">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Value" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="serviceContextId" type="xsd:string" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>{
"A-set": "A_set",
"K-Application": "K_Application"
}- Python 3.x
- Biblioteca
lxml
convert-to-xsd/
├── .gitignore # Arquivo de configuração do Git
├── convert.py # Script Python
├── example.txt # Arquivo de exemplo
├── LICENSE # Licença do projeto
├── README.md # Este arquivo
└── requirements.txt # Dependências do projeto
Este projeto está licenciado sob a Licença MIT.