diff --git a/Roadmap/12 - JSON Y XML/python/Irenetitor.py b/Roadmap/12 - JSON Y XML/python/Irenetitor.py new file mode 100644 index 0000000000..be18019007 --- /dev/null +++ b/Roadmap/12 - JSON Y XML/python/Irenetitor.py @@ -0,0 +1,185 @@ +#import os +import xml.etree.ElementTree as xml +import json + +xml_file = "Irenetitor.xml" +json_file = "Irenetitor.json" + +user = { + "name": "Ana", + "age": 25, + "birth_date": "23-02-2000", + "languages": ["Python", "JavaScript", "Java"] +} + +#XML + +def save_xml(): + + root = xml.Element("user") + + for key, value in user.items(): + child = xml.SubElement(root, key) + if isinstance(value, list): + for language in value: + xml.SubElement(child, "language").text = language + else: + child.text = str(value) + + # ✔ Write the file inside the function + tree = xml.ElementTree(root) + tree.write(xml_file) + + +save_xml() + +with open(xml_file) as xml_user: + print(xml_user.read()) + +#os.remove(xml_file) + + +''' + + Ana + 25 + 23-02-2000 + + Python + JavaScript + Java + + + +''' + +#JSON + +with open(json_file, "w") as json_user: + json.dump(user, json_user) + +with open(json_file, "r") as json_user: + print(json_user.read()) + +#os.remove(json_file) + +''' +{ + "name": "Ana", + "age": 25, + "birth_date": "23-02-2000", + "languages": ["Python", "JavaScript", "Java"] +} +''' + +#EXTRA EXERCISE + +xml_file = "user_parsed.xml" +json_file = "user_parsed.json" + +user_data = { + "name": "Juan", + "age": 29, + "birth_date": "23-02-1996", + "languages": ["Python", "JavaScript", "Java"] +} + +# Save data as XML + +def save_xml(data: dict, filename: str) -> None: + root = xml.Element("user") # ... + + for key, value in data.items(): + child = xml.SubElement(root, key) + + if isinstance(value, list): + # For lists -> create "" for each item + for language in value: + xml.SubElement(child, "language").text = language + else: + # Simple values -> just put text + child.text = str(value) + + tree = xml.ElementTree(root) + tree.write(filename, encoding="utf-8", xml_declaration=True) + +# Save data as JSON + +def save_json(data: dict, filename: str) -> None: + with open(filename, "w", encoding="utf-8") as json_user: + json.dump(data, json_user, indent=4) + + +# USER CLASS + +class User: + def __init__(self, name, age, birth_date, languages): + self.name = name + self.age = age + self.birth_date = birth_date + self.languages = languages + + def __repr__(self): + return ( + f"User(name={self.name!r}, age={self.age}, " + f"birth_date={self.birth_date!r}, languages={self.languages!r})" + ) + + @classmethod + def from_json(cls, filename: str): + """Create a User object from a JSON file.""" + with open(filename, "r", encoding="utf-8") as f: + data = json.load(f) + + return cls( + name=data["name"], + age=data["age"], + birth_date=data["birth_date"], + languages=data["languages"], + ) + + @classmethod + def from_xml(cls, filename: str): + """Create a User object from an XML file.""" + tree = xml.parse(filename) + root = tree.getroot() + + # Simple elements + name = root.find("name").text + age = int(root.find("age").text) + birth_date = root.find("birth_date").text + + # Languages (list) + languages = [] + langs_node = root.find("languages") + if langs_node is not None: + for lang_tag in langs_node.findall("language"): + languages.append(lang_tag.text) + + return cls(name, age, birth_date, languages) + + +# RUN THE FULL FLOW + +save_xml(user_data, xml_file) +save_json(user_data, json_file) + +print("\n--- XML FILE CONTENT ---") +with open(xml_file, "r", encoding="utf-8") as xml_user: + print(xml_user.read()) + +print("\n--- JSON FILE CONTENT ---") +with open(json_file, "r", encoding="utf-8") as json_user: + print(json_user.read()) + +# Create User objects +user_from_xml = User.from_xml(xml_file) +user_from_json = User.from_json(json_file) + +print("\n--- USER OBJECTS ---") +print("From XML: ", user_from_xml) +print("From JSON:", user_from_json) + +# Optional delete: +# os.remove(xml_file) +# os.remove(json_file)