You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现类似浏览器的XML文档树打印效果?

Hey there! As someone who’s spent plenty of time wrangling XML in Python, I totally get wanting that clean, browser-style tree output—nice and indented, with clear hierarchy. Let me walk you through a couple of reliable ways to pull this off.

Method 1: Use the Standard Library with xml.dom.minidom

Python’s built-in libraries can handle this with a little help from minidom, which lets you generate pretty-printed XML out of the box. The only catch is filtering out extra blank lines that toprettyxml() tends to add:

import xml.etree.ElementTree as ET
from xml.dom import minidom

def print_pretty_xml(xml_content):
    # Parse the XML string into an ElementTree root
    root = ET.fromstring(xml_content)
    # Convert to a minidom object for pretty printing
    rough_string = ET.tostring(root, 'utf-8')
    reparsed = minidom.parseString(rough_string)
    # Generate indented XML and strip empty lines
    pretty_xml = '\n'.join([line for line in reparsed.toprettyxml(indent='  ').split('\n') if line.strip()])
    print(pretty_xml)

# Example XML to test with
sample_xml = """<root>
    <person id="1">
        <name>Alice</name>
        <age>30</age>
        <address>
            <street>Main St</street>
            <city>New York</city>
        </address>
    </person>
</root>"""

print_pretty_xml(sample_xml)

This will output a neatly indented tree that matches what you’d see in a browser’s XML viewer—complete with tags, text content, and attributes.

Method 2: Build a Custom Recursive Printer (Full Control)

If you want total say over how the tree looks (like adjusting indent spacing, adding custom formatting for certain nodes, or handling edge cases), writing your own recursive function is the way to go. Here’s a basic version that handles tags, text, and attributes:

import xml.etree.ElementTree as ET

def print_xml_tree(element, indent_level=0):
    # Handle node attributes if present
    attr_text = ""
    if element.attrib:
        attr_pairs = [f'{key}="{value}"' for key, value in element.attrib.items()]
        attr_text = " " + " ".join(attr_pairs)
    
    # Print opening tag with indent
    print("  " * indent_level + f"<{element.tag}{attr_text}>")
    
    # Print node text (only if it's not just whitespace)
    if element.text and element.text.strip():
        print("  " * (indent_level + 1) + element.text.strip())
    
    # Recursively print all child nodes
    for child in element:
        print_xml_tree(child, indent_level + 1)
    
    # Print closing tag with matching indent
    print("  " * indent_level + f"</{element.tag}>")

# Parse the sample XML and run the printer
root_node = ET.fromstring(sample_xml)
print_xml_tree(root_node)

You can tweak this function to fit your exact needs—for example, changing the indent from two spaces to tabs, or adding special handling for self-closing tags if your XML uses them.

Either of these methods should get you that clean, browser-like XML tree output you’re after. Let me know if you run into any specific edge cases with your XML!

内容的提问来源于stack exchange,提问作者anne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:26:46