Python xml处理:如何让子标签与父标签在同一行输出?
解决Python生成XML时指定标签与子标签同行输出的方法
ElementTree自带的缩进功能(Python3.9+支持ET.indent())默认会给所有层级节点添加换行和缩进,要实现指定节点(如示例中的tag5)内部不换行,核心是清空指定节点及其子节点的text、tail属性里的空白符,跳过对应节点的缩进逻辑即可。
可用代码示例
先修正原代码的错误(tag5标签名多了空格、闭合标签写错为等问题),以下是可直接运行的实现:
import xml.etree.ElementTree as ET # 构造XML基础结构 root = ET.Element('tag', attrib={ "atrib":"true", "atrib2":"false", "atrib3":"1", "atrib4":"7" }) tag1 = ET.SubElement(root, 'tag1', txt='CONTENT') ET.SubElement(tag1, "tag2", name='Category').text = "1" ET.SubElement(tag1, "tag3", name='Wallet').text = ' ' ET.SubElement(tag1, "tag4", name='Increase').text = "1" # 构造tag5及其子节点 tag5 = ET.SubElement(tag1, "tag5", name='Text') div = ET.SubElement(tag5, "div") h2 = ET.SubElement(div, "h2") h2.text = "SomeTxt" # 第一步:先给全局所有节点加常规缩进 ET.indent(root, space=" ") # 第二步:核心处理:清空tag5内部所有换行缩进 tag5.text = "" # 清空tag5开头到第一个子节点的空白 for elem in tag5.iter(): elem.tail = "" # 清空tag5所有子节点闭合后的空白 # 输出XML xml_str = ET.tostring(root, encoding='unicode') print(xml_str)
实现原理
ET.indent本质是给每个节点的text(节点开标签到第一个子节点之间的内容)和tail(节点闭标签到下一个节点之间的内容)插入换行和缩进空格,我们只要把tag5内部所有节点的这两个属性的空白清空,就能让tag5和所有子节点在同一行显示,其他节点的缩进不受影响。
如果使用Python3.9以下版本,没有内置ET.indent方法,可以自己实现缩进函数,处理到tag5节点时跳过内部的空白填充逻辑即可。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

