Python json from xml

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

python function to convert xml data into json format

License

rparelius/lxml2json

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

lxml2json is a python package that converts XML elements into their JSON equivalent, and vice versa. There are many options to convert the data to a desired format:

Installation:

 from lxml2json import convert from pprint import pprint as pp xml = ''' a b c d e f  g h i  j k l  ''' d = convert(xml) pp(d) , ], 'c3': , 'c4': None>> 

lxml2json provides the following optional arguments to modify conversion behavior or output data format::

  • ordered: Boolean, defaults to False. Specifies whether to generate output as an OrderedDict.
  • noText: Defaults to None. Specifies the value to give to elements that contain no children and no text value.
  • alwaysList: Defaults to None. Allows specification of xpath queries to apply to the inputted XML element that will cause all matched elements to be stored as lists. This is useful for creating a deterministic data structure. See below for an example.
  • ignore: Defaults to None. Allows specification of xpath queries to apply to the inputted XML element that will cause all matched elements to be ignored.
  • rename: Defaults to None. Allows renaming tags by supplying tuples/lists of tuples containing xpath queries to match elements, along with a string specifying the desired tag. See below for example.
  • move: Defaults to None. Provides the option to move elements to a desired place within the hierarchy. Use case: flattening a deeply nested structure. Requires tuples/lists of tuples containing xpath queries for matching elements, along with xpath queries (relative to the matched element’s location) of where to move the element. See below for example

The order of operations is: move, rename, ignore. This allows you to essentially replace an element with a subelement by moving the subelement to the same level of hierarchy, renaming the original element, then ignoring it.

lxml2json’s processing logic will always attempt to represent an element as a dictionary, unless there are multiple sibling elements with the same tag, in which case it must represent the object as a list, since dictionaries require unique keys.

This creates the possibility of variance within the overall json data structure, since some portions of the xml may be represented as lists and other sections with the same tag may be represented as dictionaries or text values, depending on the number of siblings with the same tag.

Consider the following example:

 >>> from lxml2json import convert >>> from pprint import pprint as pp >>> >>> xml = ''' . . . 1 . 2 . 3 . . . 4 . 5 . 6 . . . 7 . . . ''' >>> 

By default, lxml2json will represent this xml object as:

Notice that the values for ‘num’ key are contained in a list for the first 2 instances, but for the last it is just its native value of seven. This behavior is expected, and for many situations functions perfectly well as a representation of the xml structure. However, it can present challenges when iterating over the resultant json object, as additional logic may be necessary to handle whether the values are contained in a list or not.

To allow for a more deterministic structure, lxml2json allows you to supply xpath queries that it will apply to the inputted xml, resulting in any matching elements being stored as lists, regardless of the number of identical sibling tags.

In this example, the xpath query: «.//num» will match all the ‘num’ elements, resulting in all such elements storing their values in a list.

Let us see this in action:

 >>> >>> pp(convert(xml, alwaysList=".//num")) , 'c2': , 'c3': >> >>> 

Notice that the 3rd ‘num’ value is now a list, similar to the first 2 instances.

You can supply as many xpath queries as you like, either as a list of queries, or a string of comma-separated values. In either case, the matching elements will be flagged.

The ‘ignore’ option allows specifying elements to ignore. Example:

>>> from lxml2json import convert >>> from pprint import pprint as pp >>> xml = '''  Thomas Robert Karen   ''' >>> >>> pp(convert(xml)) >> >>> >>> pp(convert(xml, ignore=".//granddaughter")) >> >>> 

By specifiying the xpath query «.//grandaughter», lxml2json will ignore any elements with that tag when converting.

The ‘move’ option allows for mutation of the data structure to match a desired state. One use-case is to ‘flatten’ the nesting structure.

Requires providing a tuple/list of tuples, each containing an xpath query to match elements along with a corresponding xpath query (relative to the location of the matched element) specifying where in the hierarchy to move the data.

xml = """  Joey 7   legos playstation bike     """ #default result >>> pp(convert(xml)) >>, 'name': 'Joey'>>> >>> #perhaps we want a flattened child dictionary >>> pp(convert(xml, move=(".//toy", "./../../../.."), ignore=".//favorite")) >> 

Converting from JSON to XML

lxml2json provides a ‘reverse’ function that generates an XML element (or string) for an inputted dictionary object.

Note: if the inputted dictionary has multiple top-level k:v pairs, or if the value of the top-level key is a list, then a ‘root’ element is created so as to allow for a properly formatted xml structure, which requires a single root element.

There is a single boolean option: ‘text’, which defaults to False. When set to True, the reverse function will output a pretty-printed string of the xml element created.

About

python function to convert xml data into json format

Источник

Преобразование XML в JSON и Dict в Python

Сегодня мы узнаем, как преобразовать XML в JSON и XML в Dict в Python. Мы можем использовать модуль xmltodict в python для чтения файла XML и преобразования его в данные Dict или JSON.

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

Преобразование XML в Dict и JSON

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

Когда приложениям необходимо понимать XML, предоставленный любым источником, преобразование его в JSON может оказаться утомительной задачей. Модуль xmltodict в Python делает эту задачу чрезвычайно простой и понятной для выполнения.

Начало работы

Мы можем начать работу с модулем xmltodict, но сначала нам нужно его установить. В основном мы будем использовать pip для выполнения установки.

Установка модуля xmltodict

Вот как мы можем установить модуль xmltodict с помощью индекса пакета (pip):

Это будет сделано быстро, поскольку xmltodict – очень легкий модуль. Вот результат этой установки:

Модуль xmltodict в python

Модуль не зависит от других внешних модулей, поэтому он легкий и позволяет избежать конфликтов версий.

Чтобы продемонстрировать, в системах на основе Debian этот модуль можно легко установить с помощью инструмента apt:

sudo apt install python-xmltodict

Еще один плюс в том, что у этого модуля есть официальный пакет Debian.

XML в JSON

Лучше всего начать работу этого модуля с выполнения операции, для которой он был предназначен в первую очередь, для преобразования XML в JSON. Давайте посмотрим на фрагмент кода, как это можно сделать:

import xmltodict import pprint import json my_xml = """ 123 Shubham  """ pp = pprint.PrettyPrinter(indent=4) pp.pprint(json.dumps(xmltodict.parse(my_xml)))

Преобразование xml в json в python

Здесь мы просто используем функцию parse(…) для преобразования данных XML в JSON, а затем мы используем модуль json для печати JSON в лучшем формате.

Преобразование файла XML в JSON

Хранение XML-данных в самом коде не всегда возможно и реально. Обычно мы храним наши данные либо в базе данных, либо в некоторых файлах. Мы можем напрямую выбирать файлы и конвертировать их в JSON. Давайте посмотрим на фрагмент кода, как мы можем выполнить преобразование с помощью файла XML:

import xmltodict import pprint import json with open('person.xml') as fd: doc = xmltodict.parse(fd.read()) pp = pprint.PrettyPrinter(indent=4) pp.pprint(json.dumps(doc))

Преобразование xml file в json

Здесь мы использовали другой модуль pprint для печати вывода в отформатированном виде. Кроме того, использование функции open (…) необходимо, чтобы получить дескриптор File, а затем преобразовать файл в объект JSON.

XML для Dict

Как видно из названия модуля, xmltodict фактически преобразует предоставленные XML-данные в простой словарь. Итак, мы можем просто получить доступ к данным с помощью ключей словаря. Вот пример программы:

import xmltodict import pprint import json my_xml = """ 123 Shubham  """ my_dict = xmltodict.parse(my_xml) print(my_dict['audience']['id']) print(my_dict['audience']['id']['@what'])

Преобразование xml в dict

Таким образом, теги могут использоваться как ключи вместе с ключами атрибутов. Ключи атрибутов просто должны иметь префикс @.

Поддержка пространств имен в XML

В данных XML у нас обычно есть набор пространств имен, который определяет объем данных, предоставляемых файлом XML. При преобразовании в формат JSON необходимо, чтобы эти пространства имен также сохранялись в формате JSON. Давайте рассмотрим этот пример XML-файла:

Вот пример программы о том, как мы можем включить пространства имен XML в формат JSON:

import xmltodict import pprint import json with open('person.xml') as fd: doc = xmltodict.parse(fd.read(), process_namespaces=True) pp = pprint.PrettyPrinter(indent=4) pp.pprint(json.dumps(doc))

Пространство имен xml для dict и json

Как преобразовать JSON в XML

Хотя преобразование из XML в JSON является основной целью этого модуля, xmltodict также поддерживает выполнение обратной операции, преобразовывая JSON в форму XML. Мы предоставим данные JSON в самой программе. Вот пример программы:

import xmltodict student = < "data" : < "name" : "Shubham", "marks" : < "math" : 92, "english" : 99 >, "id" : "s387hs3" > > print(xmltodict.unparse(student, pretty=True))

Преобразование json в xml

Обратите внимание, что для правильной работы необходимо указать один ключ JSON. Если учесть, что мы модифицируем нашу программу, чтобы она содержала несколько ключей JSON на самом первом уровне данных, например:

import xmltodict student = < "name" : "Shubham", "marks" : < "math" : 92, "english" : 99 >, "id" : "s387hs3" > print(xmltodict.unparse(student, pretty=True))

Ошибка преобразования json в xml

Это происходит потому, что xmltodict необходимо создать JSON с самым первым ключом в качестве корневого тега XML. Это означает, что на корневом уровне данных должен быть только один ключ JSON.

Источник

Читайте также:  While and do while in java with example
Оцените статью