Всем привет! Это моя первая статья, немного волнительно, но потными ладошками все же пишу. Идея написания пришла ко мне после задачи на работе, которая была связана с направлением 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. Собственно для это мы с вами сегодня и собрались.
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, загрузила его и не поняла. Во-первых, получилось не с первого раза.
Во-вторых, был только один тег.
Спустя несколько дней мучения, я написала знакомому, которые открыл мне глаза нам всю ситуацию, а именно сказал: ты чего? это же json...
С этого момента все стало еще запутаннее и непонятно. Выглядело все примерно так:
<?xml version=«1.0» encoding=«UTF-8»?>
<Персонал>
{
"personal":[
{
"FirstName":"Саша",
"LastName":"Петров",
"Age":"34"
},
{
"FirstName":"Вася",
"LastName":"Иванов",
"Age":"37"
}]
}
</Персонал>
Естественно, на просторах сети, я такого не встречала и пришлось придумывать что-то самой.
Поэтому я работала сначала с внутренним json, который меняла, добавляла новые объекты, а потом уже добавляла его в тег 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 файла. Не хочу здесь писать более подробно про конкретный случай, поэтому описала вкратце.
JSON и XML для новичков
Всем привет! Это моя первая статья, немного волнительно, но потными ладошками все же пишу. Идея написания пришла ко мне после задачи на работе, которая была связана с направлением xml - файлов в ЦБ....
habr.com