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

如何在Python中递归解析动态XML并按指定格式输出内容?

实现递归打印动态XML内容的方案

你需要在现有XmlNavigator类中添加两个核心方法:一个用于格式化打印完整XML结构,另一个用于递归遍历并打印每个节点的标签与文本内容。以下是修改后的完整代码:

import xml.etree.ElementTree as ET

class XmlNavigator:
    def __init__(self, xml=None):
        self.tree = ET.ElementTree(ET.fromstring(xml))
        self.root = self.tree.getroot()
        
    def parse_xml(self, node):
        for elem in self.root.iter():
            if elem.tag == f"{node}":
                return elem
    
    def _format_node(self, node, indent=0):
        """递归生成带缩进的XML字符串"""
        indent_str = "  " * indent
        # 开始标签
        result = f"{indent_str}<{node.tag}>\n"
        # 处理子节点或文本
        if node.text and node.text.strip():
            # 文本内容缩进
            result += f"  {indent_str}{node.text.strip()}\n"
        for child in node:
            result += self._format_node(child, indent + 1)
        # 结束标签
        result += f"{indent_str}</{node.tag}>\n"
        return result
    
    def print_formatted_xml(self):
        """打印格式化后的完整XML结构"""
        print(self._format_node(self.root))
    
    def _print_node_details(self, node):
        """递归打印每个节点的标签和文本"""
        # 生成节点的完整标签字符串
        start_tag = f"  <{node.tag}>"
        end_tag = f"</{node.tag}>"
        print(f"{start_tag} {node.text.strip() if node.text else ''} {end_tag}")
        print()
        if node.text and node.text.strip():
            print(node.text.strip())
            print()
        # 递归处理子节点
        for child in node:
            self._print_node_details(child)
    
    def print_all_node_details(self):
        """触发递归打印所有节点详情"""
        self._print_node_details(self.root)

if __name__ == "__main__":
    xml_string = "<note> <to>Tove</to>    <from>Jani</from>    <heading>Reminder</heading>    <body>Don't forget me this weekend!</body>  </note>  "
    xmlObj = XmlNavigator(xml_string)
    
    # 打印完整格式化XML
    xmlObj.print_formatted_xml()
    # 打印每个节点的标签和文本
    xmlObj.print_all_node_details()

代码说明

  1. _format_node方法:通过递归为每个节点添加缩进,生成符合要求的格式化XML字符串,解决原生ET.tostring无缩进的问题。
  2. print_formatted_xml方法:调用_format_node并打印完整的格式化XML结构。
  3. _print_node_details方法:递归遍历每个节点,先打印带内容的完整标签行,再单独打印节点文本(如果存在)。
  4. print_all_node_details方法:从根节点开始触发递归打印,覆盖所有子节点。

运行代码后,输出会完全匹配你要求的格式,且能适配任意结构的动态XML内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:53:22