import tkinter as tk
from tkinter import ttk, messagebox, filedialog
import xml.etree.ElementTree as ET
import os
def load_xml_data(file_path):
"""Load and parse XML file, returning headers and rows."""
try:
tree = ET.parse(file_path)
root = tree.getroot()
# Assume each child of root is a row, and its sub-elements are columns
rows = []
headers = set()
for row_elem in root:
row_data = {}
for col_elem in row_elem:
headers.add(col_elem.tag)
row_data[col_elem.tag] = col_elem.text or ""
rows.append(row_data)
headers = sorted(headers) # Keep consistent order
return headers, rows
except ET.ParseError:
messagebox.showerror("XML Error", "Invalid XML format.")
return [], []
except FileNotFoundError:
messagebox.showerror("File Error", "File not found.")
return [], []
except Exception as e:
messagebox.showerror("Error", str(e))
return [], []
def display_table(headers, rows):
"""Display data in a Tkinter Treeview table."""
# Clear old table if exists
for widget in table_frame.winfo_children():
widget.destroy()
if not headers or not rows:
tk.Label(table_frame, text="No data to display").pack()
return
# Create Treeview
tree = ttk.Treeview(table_frame, columns=headers, show="headings")
tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# Add column headings
for header in headers:
tree.heading(header, text=header)
tree.column(header, width=120, anchor="center")
# Insert rows
for row in rows:
tree.insert("", tk.END, values=[row.get(h, "") for h in headers])
# Add scrollbar
scrollbar = ttk.Scrollbar(table_frame, orient="vertical", command=tree.yview)
tree.configure(yscroll=scrollbar.set)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
def open_file():
"""Open file dialog and load XML data."""
file_path = filedialog.askopenfilename(
title="Select XML File",
filetypes=[("XML Files", "*.xml"), ("All Files", "*.*")]
)
if file_path:
headers, rows = load_xml_data(file_path)
display_table(headers, rows)
# --- Tkinter GUI Setup ---
root = tk.Tk()
root.title("XML Data Table Viewer")
root.geometry("700x400")
# Menu
menu_bar = tk.Menu(root)
file_menu = tk.Menu(menu_bar, tearoff=0)
file_menu.add_command(label="Open XML", command=open_file)
file_menu.add_separator()
file_menu.add_command(label="Exit", command=root.quit)
menu_bar.add_cascade(label="File", menu=file_menu)
root.config(menu=menu_bar)
# Table Frame
table_frame = tk.Frame(root)
table_frame.pack(fill=tk.BOTH, expand=True)
# Start GUI
root.mainloop()



