Всем привет! Это моя первая статья, немного волнительно, но потными ладошками все же пишу. Идея написания пришла ко мне после задачи на работе, которая была связана с направлением xml - файлов в ЦБ. Думаю, многие аналитики, работающие в банке, сталкивались или еще столкнутся с подобными задачами, поэтому хочу помочь будущим поколениям. (Скорее себе, так как все забывается...)

Оговорка

Сразу оговорюсь, что это лишь мой опыт, поэтому все будет объяснять на понятном МНЕ языке, но критику приветствую и всегда буду рада комментариям :)

Что такое эти ваши json и xml?

Итак, они были так похожи, но одновременно так отличались...

По сути два этих формата используются для передачи и хранения информации. Разница в том, что json можно преобразовать в объект JavaScript и обратно.

А вот с xml так не получится, потому что он используется в основном для кодирования файлов в читаемом формате. 

{
«Персонал» : [
  {
    «Имя»:«Саша»,
    «Фамилия»:«Петров»,
    «Отчество»:«Алексеевич»,
    «Возраст»:«34»
  },
  {
    «Имя»:«Вася»,
    «Фамилия»:«Иванов»,
    «Отчество»:«Сергеевич»,
    «Возраст»:«37» 
  }]
}

В этом json есть атрибут "Персонал", в котором хранится информация о всех сотрудниках, с краткой информацией ФИО и возраст.

JSON состоит из объектов, которые заключаются в фигурные сточки {}. Внутри него находится пара: ключ (название параметра, свойство и тд) и значение.

В нашем примере есть пары: "Имя"-"Саша", "Фамилия"-"Петров" и тд. Они находятся внутри общего json-объекта, и принадлежать паре "Персонал" и словарь json-объектов с описанием сотрудников.

Аналогичный набор xml будет выглядеть так:

<?xml version=«1.0» encoding=«UTF-8»?>
<Персонал>
  <Сотрудник>
    <Имя>Саша</Имя>
    <Фамилия>Петров</Фамилия>
    <Отчество>Алексеевчи</Отчество>
    <Возраст>34</Возраст>
  </Сотрудник>
  <Сотрудник>
    <Имя>Вася</Имя>
    <Фамилия>Иванов</Фамилия>
    <Отчество>Сергеевич</Отчество>
    <Возраст>37</Возраст>
    </Сотрудник>
</Персонал>

Согласитесь: с виду, все вполне понятно, есть небольшие отличия в синтаксисе и все? Я тоже так думаю и даже скажу, что json можно легко преобразовать в xml.

Xml имеет свою кодировку, которую важно учитывать при создания файлов. (Учитесь на моих ошибках). Также есть xsd или xml-схема, которая создается для проверки правильности xml и в каком-то смысле упрощения ее создания.

XML состоит из тегов, которые вносятся в скобки <>. В нашем примере это Персонал, Сотрудник, Имя, Фамилия, Отчество, Возраст. Теги обеспечивают сложное кодирование данных для интеграции информационных потоков между различными системами.

Думаю, основной информации достаточно, так что можем приступить к работе с этими форматами в Python. Собственно для это мы с вами сегодня и собрались.

Знакомство в python

Для начала возьмем на обработку json, точнее попробуем его создать

import json #загружаем библиотеку

#Создаем словарь с нашим json
string = {
    "personal":[
    {
    "FirstName":"Саша",
    "LastName":"Петров",
    "Age":"34"
    },
    {
    "FirstName":"Вася",
    "LastName":"Иванов",
    "Age":"37"   
    }
]
}

# Преобразование словаря в JSON-строку
json_string = json.dumps(string)
# Преобразовываем JSON-строку в сам JSON, чтобы можно было к нему обращаться
data = json.loads(json_string)

Теперь, когда у нас получилось создать json мы можем выгрузить определённый элемент или же поменять значение.

# Делаем обращения к первому элементу
print(data.get('personal')[0])

# Поменяем возраст у первого сотрудника
data['personal'][0]['Age'] = 56
# Проверим результат
print(data.get('personal')[0])

Результат:

{'FirstName': 'Саша', 'LastName': 'Петров', 'Age': '34'}
{'FirstName': 'Саша', 'LastName': 'Петров', 'Age': 56}

Но проще всего менять значения в самом словаре и загружать его в json-файл.

# Поменяем возраст у первого сотрудника
string['personal'][0]['Age'] = 56
# Проверим результат
print(string.get('personal')[0])

#Записывае словарь в json-файл
try:
    with open("data.json", "w") as json_file:
        json.dump(string, json_file)
except:
    print("not loaded")

Здесь у нас идет обращения к объектам сначала первый объект "personal". Потом мы выбираем первого сотрудника, поэтому индекс 0 и название значения "Age".

Соответственно далее все уже зависит от ваших задач и желаний. Теперь познакомимся и с xml.

import xml.etree.ElementTree as ET # Загружаем библиотеку

# Создаем основной элемент, в который будем добавлять последующие
data_xml = ET.Element('personal') 

# Добавляем первого сотрудника
employee = ET.SubElement(data_xml, 'employee')
# Добавляем вложенные элементы в созданый employee
employee_n = ET.SubElement(employee, 'Name')
employee_n.text = "Саша"
employee_l = ET.SubElement(employee, 'LastName')
employee_l.text = "Петров"
employee_a = ET.SubElement(employee, 'Age')
employee_a.text = "34"

# Добавляем второго сотрудника
employee = ET.SubElement(data_xml, 'employee')
# Добавляем вложенные элементы в созданый employee
employee_n = ET.SubElement(employee, 'Name')
employee_n.text = 'Вася'
employee_l = ET.SubElement(employee, 'LastName')
employee_l.text = 'Иванов'
employee_a = ET.SubElement(employee, 'Age')
employee_a.text = '37'

# Посмотрим получившийся xml
print(ET.dump(data_xml))

Тут мы создаем вложенный элемент методом SubElement, в котором указываем элемент, куда добавляем, и название. То есть в элемент data_xml добавляем вложенный элемент employee, а в него уже Name, LastName, Age. И с помощью метода text добавляем сами значения.

Соответсвенно, как и в прошлом случае мы можем обратиться к элементам и изменить их.

# Посмотрим элементы
print(data_xml[0])
print(data_xml[0][1])
print(data_xml[0][1].text)

# Поменяем фамилию 
data_xml[0][1].text="Сидоров"

# Посмотрим элементы
print(data_xml[0][1].text)

Результат.

<Element 'employee' at 0x7fc0a88df720>
<Element 'LastName' at 0x7fc0a88f4090>
Петров
Сидоров

Все выглядит достаточно просто. Мы научились создавать, изменять, выгружать в файл json и xml. В следующем разделе, я опишу свой пример создания xml-файла с json внутри.

Мой опыт, заключение

Итак, однажды, ко мне пришла задача на создание автоматического xml-файла, я прочитала про библиотеку, посмотрела информацию и решила, что будет легко. Я быстро сделаю и получу свои лавры. НО! В теории все выглядит и звучит правда легко, а вот на практике...

Я взяла готовый xml, загрузила его и не поняла. Во-первых, получилось не с первого раза.

Во-вторых, был только один тег.

Спустя несколько дней мучения, я написала знакомому, которые открыл мне глаза нам всю ситуацию, а именно сказал: ты чего? это же json...

С этого момента все стало еще запутаннее и непонятно. Выглядело все примерно так:

<?xml version=«1.0» encoding=«UTF-8»?>
<Персонал>
  {
    "personal":[
    {
    "FirstName":"Саша",
    "LastName":"Петров",
    "Age":"34"
    },
    {
    "FirstName":"Вася",
    "LastName":"Иванов",
    "Age":"37"   
    }]
   }
</Персонал>

Естественно, на просторах сети, я такого не встречала и пришлось придумывать что-то самой.

Поэтому я работала сначала с внутренним json, который меняла, добавляла новые объекты, а потом уже добавляла его в тег xml файла. Не хочу здесь писать более подробно про конкретный случай, поэтому описала вкратце.

В заключении: Очень надеюсь, что кому-то это поможет разобраться в непонятной теме.
Готова к замечаниям и критики, большое спасибо за потраченное время :)

Комментарии (8)


  1. maxp
    27.08.2023 13:12
    +8

    Рекомендую для начала почитать про XML - откуда он взялся, как устроен. Как минимум про аттрибуты и xmlns. Если вдруг станет интересно, то потом про xsd и xslt.

    Про json надо начинать читать отсюда - https://www.json.org/

    А то у вас сейчас представление о json/xml довольно далёкое от действительности.


    1. nadyaloseva Автор
      27.08.2023 13:12

      Спасибо за помощь, я правда не достаточно разбираюсь, поэтому и писала про свой опыт)


  1. vagon333
    27.08.2023 13:12
    +7

    Надежда, вы молодец, что решились на статью.
    Сожалею, что суровые мужи наминусили вам в карму и за статью, и никто не удосужился объяснить причину.

    Попробую угадать причину:
    - статья слишком базовая: масса ребят получают эту инфу и опыт при начальном знакомстве с XML/JSON.
    - кусочное описание: если уж повторять доку (лучше не надо), то вы описали один пример из массы, но остальное не упомянули. В доке структурировано и полностью.
    - смешивая XML и JSON хорошо бы описать разницу, хотя тоже, лучше не надо - инет забит этой инфой.

    Резюмируя:
    Не огорчайтесь, наберитесь терпения, посидите на хабре чтоб понять аудиторию и характер статей.
    Со своей стороны поддержал статью и карму.


    1. selivanov_pavel
      27.08.2023 13:12
      +5

      В карму не минусил, но за статью минусы заслуженные. Очень слабая, будвально два импорта и три строчки кода. Про xml вообще написано настолько мало, что просто введёт в заблуждение не знакомого с форматом человека. Нет упоминаний хотя бы про: атрибуты элементов, экранирование спецсимволов, комментарии.

      Все были новичками. Но надо же понимать, что статья "я включил аппарат, прицепил контакт к железке, поднёс электрод и там пыщь - искры" не годится для сайта профессиональных сварщиков.


    1. nadyaloseva Автор
      27.08.2023 13:12

      Большое спасибо за поддержку!
      Первый блин всегда комом... Так что осуждение от старших коллег - это даже хорошо и закаляет дух :)


  1. saboteur_kiev
    27.08.2023 13:12
    +3

    А вот с xml так не получится, потому что он используется в основном для кодирования файлов в читаемом формате. 

    Ни XML ни JSON не являются файлами и не используются "в основном" для кодирования файлов.
    Это способ нотации структурированных данных, в основном текста.
    В XML используется Markup Language, то есть поля и структуры могут выделяться тегами, тег может иметь несколько аттрибутов.
    JSON - Object Notation, он также содержит различные поля, для которых можно указать тип при помощи кавычек, скобок, двоеточий. Поэтому JSON действительно легко преобразовать в объект или структуру практически в любом языке.

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


    1. nadyaloseva Автор
      27.08.2023 13:12

      Большое спасибо за комментарий)
      Я и предполагала базовую подачу для людей, которым может понадобится простое описание без углублений. На своем опыте поняла, что все описанное на просторах сети очень технично и для решение прикладной задачи, без постоянной работы с форматом, почти не найти. Именно поэтому и был такой подача
      Я не оправдываю. Это первый опыт, я не совсем знаю о аудитории, поэтому еще раз спасибо. Буду стараться и развивать свои навыки написания дальше :)


  1. domix32
    27.08.2023 13:12
    +1

    «Возраст»:«34»

    О, я бы посмотрел как кто-то обрабатывает жсоны в "ёлочки" вместо "лапок". Ну и за строковые числа иногда стоит стрелять.

    <Возраст>34</Возраст>

    для новичка маловато понимания, что есть ещё такие штуки как аттрибуты у нод. То бишь

    <Сотрудник Имя="Вася" Фамилия="Пупкин" Возраст="34"/>

    Семантика XML подразумевает, что вложенные ноды имеют дополнительные связи с вышележащими нодами ещё (по аналогии с базами данных - один к одному, один ко многим и пр), а всё что связано непосредственно с объектом - это его аттрибуты.

    Python

    Стоит также упомянуть про такие штуки как entity и чем это может грозить. В частности тому же xml parser.