如何在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()
代码说明
_format_node方法:通过递归为每个节点添加缩进,生成符合要求的格式化XML字符串,解决原生ET.tostring无缩进的问题。print_formatted_xml方法:调用_format_node并打印完整的格式化XML结构。_print_node_details方法:递归遍历每个节点,先打印带内容的完整标签行,再单独打印节点文本(如果存在)。print_all_node_details方法:从根节点开始触发递归打印,覆盖所有子节点。
运行代码后,输出会完全匹配你要求的格式,且能适配任意结构的动态XML内容。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

