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.

102 lines
3.3 KiB

from xml.etree import ElementTree as ET
from xml.dom import minidom
import os
import json
import utils.json_utils as json_utils
import utils.constants as const
def create_xml_file(book_content, book_metadata):
book_root = ET.Element('book')
book_root.set('code', book_metadata['book_code'])
book_info = ET.SubElement(book_root, 'bookInfo')
content = ET.SubElement(book_root, 'content')
title = ET.SubElement(book_info, 'title')
title.text = book_metadata['title']
lang = ET.SubElement(book_info, 'lang')
lang.text = book_metadata['lang']
is_translation = ET.SubElement(book_info, 'isTranslation')
is_translation.text = book_metadata['isTranslation']
total_chapters = ET.SubElement(book_info, 'totalChapters')
total_chapters.text = str(book_metadata['totalChapters'])
source = ET.SubElement(book_info, 'source')
source.text = book_metadata['source']
if 'description' in book_metadata:
description = ET.SubElement(book_info, 'description')
description.text = book_metadata['description']
if 'isbn' in book_metadata:
isbn = ET.SubElement(book_info, 'isbn')
isbn.text = book_metadata['isbn']
authors_list = book_metadata['authors']
for auth in authors_list:
author = ET.SubElement(book_info, 'author')
author.text = auth['name']
if 'translator' in auth:
author.set('translator', auth['translator'])
for chapter in book_content:
if 'sentences' not in chapter:
continue
chapter_element = ET.SubElement(content, 'chapter')
chapter_element.set('num', str(chapter['chapter_num']))
chapter_element.set('name', chapter['chapter_name'])
sentences_dict = chapter['sentences']
for key in sentences_dict.keys():
sentence = ET.SubElement(chapter_element, 'sentence')
sentence.set('num', str(key + 1))
sentence.text = sentences_dict[key]
# tree = ET.ElementTree(book_root)
# tree.write(filename)
root_dir = os.path.dirname(os.path.dirname(__file__))
output_dir = os.path.join(root_dir, "xml_files")
filename = book_root.get('code') + "_" + lang.text + ".xml"
file = open(output_dir + '/' + filename, 'w')
file_path = file.name
file.write(prettify(book_root))
file.close()
print(const.BLUE, 'Saved Book Content to XML File - Path :: ', file_path, const.END)
json_obj = {}
book_code = book_root.get('code')
json_obj['xml_file'] = filename
json_obj['lang'] = lang.text
json_obj['xml_file_path'] = file_path
json_obj['is_validated'] = False
json_obj['is_saved_to_db'] = False
add_xml_book_data_to_json(book_code, json_obj)
return file_path
def add_xml_book_data_to_json(book_code, json_obj):
json_data = json_utils.read_json_file(const.JSON_PATH)
books = json_data['books']
if book_code in books.keys():
books[book_code].append(json_obj)
else:
books[book_code] = [json_obj]
json_data['books'] = books
json_utils.write_json_file(const.JSON_PATH, json_data)
print(const.BLUE, 'Added XML Book Entry to JSON', const.END)
def prettify(root):
""" Return a pretty-printed XML string for the Element.
"""
rough_string = ET.tostring(root, 'utf-8')
parsed = minidom.parseString(rough_string)
return parsed.toprettyxml(indent="\t")