There are two access methods shown below:
Using the second method, you can be rearrange into a class with appropriate update methods
- process_using_defusedxml this uses an etree, but not xml.etree.ElementTree which is very unsafe, venerable to attacks
Quote:Note XML is not safe, see: https://docs.python.org/3/library/xml.ht...rabilities use defusedxml instead install with pip: 'pip install defusedxml see GitHub: https://github.com/tiran/defusedxml
- process_using_bs4 this is (my) preferred method, and as far as I know safe. It uses BeautifulSoup4 to parse the input.
Using the second method, you can be rearrange into a class with appropriate update methods
from pathlib import Path import os def process_using_defusedxml(filename): import defusedxml.ElementTree as ET def tree_walk(root, level=0): indent = " " * (4 * level) for child in root: print(f"\n{indent}Type(child): {type(child)}") print(f"\n{indent}tag: {child.tag}") print(f" {indent}attribute: {child.attrib}") print(f" {indent}text: {child.text}") level += 1 tree_walk(child) tree = ET.parse(filename) root = tree.getroot() tree_walk(root) # alternative method using Beautiful Soup def process_using_bs4(filename): from bs4 import BeautifulSoup with filename.open('r') as fp: xmldata = fp.read() soup = BeautifulSoup(xmldata, 'lxml') module = soup.find('module') modulename = module.get('bs') print(f"Module Name: {modulename}") objects = soup.find_all('object') print(f"\nobjects:") for n, obj in enumerate(objects): print(f"\nobject_id: {obj.get('id')} object name: {obj.get('name')}" \ f" object number: {obj.get('number')}") items = obj.find_all('item') if items: print() for n1, item in enumerate(items): if item: print(f" item number: {n1} name: {item.get('name')} " \ f"value: {item.get('value')}") os.chdir(os.path.abspath(os.path.dirname(__file__))) filename = Path('.') / 'Mainfile_1.xml' # process_using_defusedxml(filename) process_using_bs4(filename)BeautifulSoup4 (bs4) method results:
Output:Module Name: Mainfile_1
objects:
object_id: 1000 object name: namex object number: 1
item number: 0 name: item0 value: 100
item number: 1 name: item00 value: 100
object_id: 1001 object name: namey object number: 2
item number: 0 name: item1 value: 100
item number: 1 name: item00 value: 100
object_id: 1234 object name: name1 object number: 3
item number: 0 name: item1 value: FAIL
item number: 1 name: item2 value: 233
item number: 2 name: item3 value: 233
item number: 3 name: item4 value: FAIL
object_id: 1238 object name: name2 object number: 4
item number: 0 name: item8 value: FAIL
item number: 1 name: item9 value: 233
object_id: 2345 object name: name32 object number: 5
item number: 0 name: item1 value: 111
item number: 1 name: item2 value: FAIL
object_id: 2347 object name: name4 object number: 6
item number: 0 name: item1 value: FAIL
item number: 1 name: item2 value: FAIL
item number: 2 name: item3 value: 233
item number: 3 name: item4 value: FAIL
This should give you something to work with.