You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

44 lines
1.1 KiB

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import sys
import argparse
parser = argparse.ArgumentParser(description='Convert an XML file to JSON.')
parser.add_argument('--unsafe', action='store_true',
help='do not use defusedxml: only for known-safe XML!')
parser.add_argument('infile', nargs='?', type=argparse.FileType('rt'),
default=sys.stdin)
def xml_element_to_dict(elem):
"Convert XML Element to a simple dict"
inner = dict(elem.attrib)
children = list(map(xml_element_to_dict, list(elem)))
text = elem.text and elem.text.strip()
if text:
inner['@text'] = text
if children:
inner['@children'] = children
return {elem.tag: inner}
def main(args):
"Dump JSON-from-parsed-XML to stdout"
if args.unsafe:
import xml.etree.ElementTree as ElementTree
# import defusedxml.ElementTree as ElementTree
xml_parser = ElementTree.parse(args.infile)
root = xml_parser.getroot()
json.dump(xml_element_to_dict(root), sys.stdout, indent=2)
print()
if __name__ == '__main__':
args = parser.parse_args()
main(args)